Sat Apr 26 2014 22:03:10

Asterisk developer's documentation


res_format_attr_h263.c File Reference

H.263 Format Attribute Module. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/format.h"
Include dependency graph for res_format_attr_h263.c:

Go to the source code of this file.

Enumerations

enum  h263_attr_keys {
  H263_ATTR_KEY_SQCIF, H263_ATTR_KEY_QCIF, H263_ATTR_KEY_CIF, H263_ATTR_KEY_CIF4,
  H263_ATTR_KEY_CIF16, H263_ATTR_KEY_VGA, H263_ATTR_KEY_CUSTOM_XMAX, H263_ATTR_KEY_CUSTOM_YMAX,
  H263_ATTR_KEY_CUSTOM_MPI, H263_ATTR_KEY_F, H263_ATTR_KEY_I, H263_ATTR_KEY_J,
  H263_ATTR_KEY_T, H263_ATTR_KEY_K, H263_ATTR_KEY_N, H263_ATTR_KEY_P_SUB1,
  H263_ATTR_KEY_P_SUB2, H263_ATTR_KEY_P_SUB3, H263_ATTR_KEY_P_SUB4, H263_ATTR_KEY_PAR_WIDTH,
  H263_ATTR_KEY_PAR_HEIGHT, H263_ATTR_KEY_BPP, H263_ATTR_KEY_HRD, H263_ATTR_KEY_END
}

Functions

static void __reg_module (void)
static void __unreg_module (void)
static const char * h263_attr_key_to_str (enum h263_attr_keys key, const struct ast_format_attr *format_attr)
 Helper function which converts a key enum into a string value for SDP.
static int h263_format_attr_get_joint (const struct ast_format_attr *fattr1, const struct ast_format_attr *fattr2, struct ast_format_attr *result)
static void h263_format_attr_sdp_generate (const struct ast_format_attr *format_attr, unsigned int payload, struct ast_str **str)
static int h263_format_attr_sdp_parse (struct ast_format_attr *format_attr, const char *attributes)
static int load_module (void)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "H.263 Format Attribute Module" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static struct ast_module_infoast_module_info = &__mod_info
static struct
ast_format_attr_interface 
h263_format_attr_interface
static struct
ast_format_attr_interface 
h263p_format_attr_interface

Detailed Description

H.263 Format Attribute Module.

Author:
Joshua Colp <jcolp@digium.com> 

This is a format attribute module for the H.263 codec.

Definition in file res_format_attr_h263.c.


Enumeration Type Documentation

Enumerator:
H263_ATTR_KEY_SQCIF 

Minimum picture interval for SQCIF resolution

H263_ATTR_KEY_QCIF 

Minimum picture interval for QCIF resolution

H263_ATTR_KEY_CIF 

Minimum picture interval for CIF resolution

H263_ATTR_KEY_CIF4 

Minimum picture interval for CIF4 resolution

H263_ATTR_KEY_CIF16 

Minimum picture interval for CIF16 resolution

H263_ATTR_KEY_VGA 

Minimum picture interval for VGA resolution

H263_ATTR_KEY_CUSTOM_XMAX 

Custom resolution (Xmax)

H263_ATTR_KEY_CUSTOM_YMAX 

Custom resolution (Ymax)

H263_ATTR_KEY_CUSTOM_MPI 

Custom resolution (MPI)

H263_ATTR_KEY_F 

F annex support

H263_ATTR_KEY_I 

I annex support

H263_ATTR_KEY_J 

J annex support

H263_ATTR_KEY_T 

T annex support

H263_ATTR_KEY_K 

K annex support

H263_ATTR_KEY_N 

N annex support

H263_ATTR_KEY_P_SUB1 

Reference picture resampling (sub mode 1)

H263_ATTR_KEY_P_SUB2 

Reference picture resampling (sub mode 2)

H263_ATTR_KEY_P_SUB3 

Reference picture resampling (sub mode 3)

H263_ATTR_KEY_P_SUB4 

Reference picture resampling (sub mode 4)

H263_ATTR_KEY_PAR_WIDTH 

Pixel aspect ratio (width)

H263_ATTR_KEY_PAR_HEIGHT 

Pixel aspect ratio (height)

H263_ATTR_KEY_BPP 

Bits per picture maximum

H263_ATTR_KEY_HRD 

Hypothetical reference decoder status

H263_ATTR_KEY_END 

End terminator for list

Definition at line 41 of file res_format_attr_h263.c.

                    {
   H263_ATTR_KEY_SQCIF,       /*!< Minimum picture interval for SQCIF resolution */
   H263_ATTR_KEY_QCIF,        /*!< Minimum picture interval for QCIF resolution */
   H263_ATTR_KEY_CIF,         /*!< Minimum picture interval for CIF resolution */
   H263_ATTR_KEY_CIF4,        /*!< Minimum picture interval for CIF4 resolution */
   H263_ATTR_KEY_CIF16,       /*!< Minimum picture interval for CIF16 resolution */
   H263_ATTR_KEY_VGA,         /*!< Minimum picture interval for VGA resolution */
   H263_ATTR_KEY_CUSTOM_XMAX, /*!< Custom resolution (Xmax) */
   H263_ATTR_KEY_CUSTOM_YMAX, /*!< Custom resolution (Ymax) */
   H263_ATTR_KEY_CUSTOM_MPI,  /*!< Custom resolution (MPI) */
   H263_ATTR_KEY_F,           /*!< F annex support */
   H263_ATTR_KEY_I,           /*!< I annex support */
   H263_ATTR_KEY_J,           /*!< J annex support */
   H263_ATTR_KEY_T,           /*!< T annex support */
   H263_ATTR_KEY_K,           /*!< K annex support */
   H263_ATTR_KEY_N,           /*!< N annex support */
   H263_ATTR_KEY_P_SUB1,      /*!< Reference picture resampling (sub mode 1) */
   H263_ATTR_KEY_P_SUB2,      /*!< Reference picture resampling (sub mode 2) */
   H263_ATTR_KEY_P_SUB3,      /*!< Reference picture resampling (sub mode 3) */
   H263_ATTR_KEY_P_SUB4,      /*!< Reference picture resampling (sub mode 4) */
   H263_ATTR_KEY_PAR_WIDTH,   /*!< Pixel aspect ratio (width) */
   H263_ATTR_KEY_PAR_HEIGHT,  /*!< Pixel aspect ratio (height) */
   H263_ATTR_KEY_BPP,         /*!< Bits per picture maximum */
   H263_ATTR_KEY_HRD,         /*!< Hypothetical reference decoder status */
   H263_ATTR_KEY_END,         /*!< End terminator for list */
};

Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 295 of file res_format_attr_h263.c.

static void __unreg_module ( void  ) [static]

Definition at line 295 of file res_format_attr_h263.c.

static const char* h263_attr_key_to_str ( enum h263_attr_keys  key,
const struct ast_format_attr format_attr 
) [static]

Helper function which converts a key enum into a string value for SDP.

Definition at line 134 of file res_format_attr_h263.c.

References ast_format_attr::format_attr, H263_ATTR_KEY_BPP, H263_ATTR_KEY_CIF, H263_ATTR_KEY_CIF16, H263_ATTR_KEY_CIF4, H263_ATTR_KEY_CUSTOM_MPI, H263_ATTR_KEY_CUSTOM_XMAX, H263_ATTR_KEY_CUSTOM_YMAX, H263_ATTR_KEY_END, H263_ATTR_KEY_F, H263_ATTR_KEY_HRD, H263_ATTR_KEY_I, H263_ATTR_KEY_J, H263_ATTR_KEY_K, H263_ATTR_KEY_N, H263_ATTR_KEY_P_SUB1, H263_ATTR_KEY_P_SUB2, H263_ATTR_KEY_P_SUB3, H263_ATTR_KEY_P_SUB4, H263_ATTR_KEY_PAR_HEIGHT, H263_ATTR_KEY_PAR_WIDTH, H263_ATTR_KEY_QCIF, H263_ATTR_KEY_SQCIF, H263_ATTR_KEY_T, and H263_ATTR_KEY_VGA.

Referenced by h263_format_attr_sdp_generate().

{
   switch (key) {
   case H263_ATTR_KEY_SQCIF:
      return format_attr->format_attr[key] ? "SQCIF" : NULL;
   case H263_ATTR_KEY_QCIF:
      return format_attr->format_attr[key] ? "QCIF" : NULL;
   case H263_ATTR_KEY_CIF:
      return format_attr->format_attr[key] ? "CIF" : NULL;
   case H263_ATTR_KEY_CIF4:
      return format_attr->format_attr[key] ? "CIF4" : NULL;
   case H263_ATTR_KEY_CIF16:
      return format_attr->format_attr[key] ? "CIF16" : NULL;
   case H263_ATTR_KEY_VGA:
      return format_attr->format_attr[key] ? "VGA" : NULL;
   case H263_ATTR_KEY_F:
      return "F";
   case H263_ATTR_KEY_I:
      return "I";
   case H263_ATTR_KEY_J:
      return "J";
   case H263_ATTR_KEY_T:
      return "T";
   case H263_ATTR_KEY_K:
      return "K";
   case H263_ATTR_KEY_N:
      return "N";
   case H263_ATTR_KEY_BPP:
      return "BPP";
   case H263_ATTR_KEY_HRD:
      return "HRD";
   case H263_ATTR_KEY_CUSTOM_XMAX:
   case H263_ATTR_KEY_CUSTOM_YMAX:
   case H263_ATTR_KEY_CUSTOM_MPI:
   case H263_ATTR_KEY_P_SUB1:
   case H263_ATTR_KEY_P_SUB2:
   case H263_ATTR_KEY_P_SUB3:
   case H263_ATTR_KEY_P_SUB4:
   case H263_ATTR_KEY_PAR_WIDTH:
   case H263_ATTR_KEY_PAR_HEIGHT:
   case H263_ATTR_KEY_END:
   default:
      return NULL;
   }

   return NULL;
}
static int h263_format_attr_get_joint ( const struct ast_format_attr fattr1,
const struct ast_format_attr fattr2,
struct ast_format_attr result 
) [static]

Definition at line 68 of file res_format_attr_h263.c.

References ast_format_attr::format_attr, H263_ATTR_KEY_END, and H263_ATTR_KEY_SQCIF.

{
   int i;

   /* These are all receiver options so we just copy over what they sent */
   for (i = H263_ATTR_KEY_SQCIF; i < H263_ATTR_KEY_END; i++) {
      result->format_attr[i] = fattr1->format_attr[i] ? fattr1->format_attr[i] : fattr2->format_attr[i];
   }

   return 0;
}
static void h263_format_attr_sdp_generate ( const struct ast_format_attr format_attr,
unsigned int  payload,
struct ast_str **  str 
) [static]

Definition at line 182 of file res_format_attr_h263.c.

References ast_str_append(), ast_format_attr::format_attr, H263_ATTR_KEY_CUSTOM_MPI, H263_ATTR_KEY_CUSTOM_XMAX, H263_ATTR_KEY_CUSTOM_YMAX, H263_ATTR_KEY_END, H263_ATTR_KEY_P_SUB1, H263_ATTR_KEY_P_SUB2, H263_ATTR_KEY_P_SUB3, H263_ATTR_KEY_P_SUB4, H263_ATTR_KEY_PAR_HEIGHT, H263_ATTR_KEY_PAR_WIDTH, H263_ATTR_KEY_SQCIF, h263_attr_key_to_str(), and name.

{
   int i, added = 0;

   for (i = H263_ATTR_KEY_SQCIF; i < H263_ATTR_KEY_END; i++) {
      const char *name;

      if (i == H263_ATTR_KEY_CUSTOM_XMAX) {
         if (!format_attr->format_attr[H263_ATTR_KEY_CUSTOM_XMAX] || !format_attr->format_attr[H263_ATTR_KEY_CUSTOM_YMAX] ||
             !format_attr->format_attr[H263_ATTR_KEY_CUSTOM_MPI]) {
            continue;
         }

         if (!added) {
            ast_str_append(str, 0, "a=fmtp:%d CUSTOM=%u,%u,%u", payload, format_attr->format_attr[H263_ATTR_KEY_CUSTOM_XMAX],
                      format_attr->format_attr[H263_ATTR_KEY_CUSTOM_YMAX], format_attr->format_attr[H263_ATTR_KEY_CUSTOM_MPI]);
            added = 1;
         } else {
            ast_str_append(str, 0, ";CUSTOM=%u,%u,%u", format_attr->format_attr[H263_ATTR_KEY_CUSTOM_XMAX],
                      format_attr->format_attr[H263_ATTR_KEY_CUSTOM_YMAX], format_attr->format_attr[H263_ATTR_KEY_CUSTOM_MPI]);
         }
      } else if (i == H263_ATTR_KEY_PAR_WIDTH) {
         if (!format_attr->format_attr[H263_ATTR_KEY_PAR_WIDTH] || !format_attr->format_attr[H263_ATTR_KEY_PAR_HEIGHT]) {
            continue;
         }

         if (!added) {
            ast_str_append(str, 0, "a=fmtp:%d PAR=%u:%u", payload, format_attr->format_attr[H263_ATTR_KEY_PAR_WIDTH],
                      format_attr->format_attr[H263_ATTR_KEY_PAR_HEIGHT]);
            added = 1;
         } else {
            ast_str_append(str, 0, ";PAR=%u:%u", format_attr->format_attr[H263_ATTR_KEY_PAR_WIDTH],
                      format_attr->format_attr[H263_ATTR_KEY_PAR_HEIGHT]);
         }
      } else if (i == H263_ATTR_KEY_P_SUB1) {
         if (!format_attr->format_attr[H263_ATTR_KEY_P_SUB1]) {
            continue;
         }

         if (!added) {
            ast_str_append(str, 0, "a=fmtp:%d P=%u", payload, format_attr->format_attr[H263_ATTR_KEY_P_SUB1]);
            added = 1;
         } else {
            ast_str_append(str, 0, ";P=%u", format_attr->format_attr[H263_ATTR_KEY_P_SUB1]);
         }

         if (format_attr->format_attr[H263_ATTR_KEY_P_SUB2]) {
            ast_str_append(str, 0, ",%u", format_attr->format_attr[H263_ATTR_KEY_P_SUB2]);
         }
                        if (format_attr->format_attr[H263_ATTR_KEY_P_SUB3]) {
                                ast_str_append(str, 0, ",%u", format_attr->format_attr[H263_ATTR_KEY_P_SUB3]);
                        }
                        if (format_attr->format_attr[H263_ATTR_KEY_P_SUB4]) {
                                ast_str_append(str, 0, ",%u", format_attr->format_attr[H263_ATTR_KEY_P_SUB4]);
                        }

      } else if ((name = h263_attr_key_to_str(i, format_attr))) {
         if (!added) {
            ast_str_append(str, 0, "a=fmtp:%d %s=%u", payload, name, format_attr->format_attr[i]);
            added = 1;
         } else {
            ast_str_append(str, 0, ";%s=%u", name, format_attr->format_attr[i]);
         }
      }
   }

   if (added) {
      ast_str_append(str, 0, "\r\n");
   }

   return;
}
static int h263_format_attr_sdp_parse ( struct ast_format_attr format_attr,
const char *  attributes 
) [static]

Definition at line 80 of file res_format_attr_h263.c.

References ast_format_attr::format_attr, H263_ATTR_KEY_BPP, H263_ATTR_KEY_CIF, H263_ATTR_KEY_CIF16, H263_ATTR_KEY_CIF4, H263_ATTR_KEY_CUSTOM_MPI, H263_ATTR_KEY_CUSTOM_XMAX, H263_ATTR_KEY_CUSTOM_YMAX, H263_ATTR_KEY_F, H263_ATTR_KEY_HRD, H263_ATTR_KEY_I, H263_ATTR_KEY_J, H263_ATTR_KEY_K, H263_ATTR_KEY_N, H263_ATTR_KEY_P_SUB1, H263_ATTR_KEY_P_SUB2, H263_ATTR_KEY_P_SUB3, H263_ATTR_KEY_P_SUB4, H263_ATTR_KEY_PAR_HEIGHT, H263_ATTR_KEY_PAR_WIDTH, H263_ATTR_KEY_QCIF, H263_ATTR_KEY_SQCIF, H263_ATTR_KEY_T, and H263_ATTR_KEY_VGA.

{
   char *attribs = ast_strdupa(attributes), *attrib;

   while ((attrib = strsep(&attribs, ";"))) {
      unsigned int val, val2 = 0, val3 = 0, val4 = 0;

      if (sscanf(attrib, "SQCIF=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_SQCIF] = val;
      } else if (sscanf(attrib, "QCIF=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_QCIF] = val;
      } else if (sscanf(attrib, "CIF=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_CIF] = val;
      } else if (sscanf(attrib, "CIF4=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_CIF4] = val;
      } else if (sscanf(attrib, "CIF16=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_CIF16] = val;
      } else if (sscanf(attrib, "VGA=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_VGA] = val;
      } else if (sscanf(attrib, "CUSTOM=%30u,%30u,%30u", &val, &val2, &val3) == 3) {
         format_attr->format_attr[H263_ATTR_KEY_CUSTOM_XMAX] = val;
         format_attr->format_attr[H263_ATTR_KEY_CUSTOM_YMAX] = val2;
         format_attr->format_attr[H263_ATTR_KEY_CUSTOM_MPI] = val3;
      } else if (sscanf(attrib, "F=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_F] = val;
      } else if (sscanf(attrib, "I=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_I] = val;
      } else if (sscanf(attrib, "J=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_J] = val;
      } else if (sscanf(attrib, "T=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_T] = val;
      } else if (sscanf(attrib, "K=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_K] = val;
      } else if (sscanf(attrib, "N=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_N] = val;
      } else if (sscanf(attrib, "PAR=%30u:%30u", &val, &val2) == 2) {
         format_attr->format_attr[H263_ATTR_KEY_PAR_WIDTH] = val;
         format_attr->format_attr[H263_ATTR_KEY_PAR_HEIGHT] = val2;
      } else if (sscanf(attrib, "BPP=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_BPP] = val;
      } else if (sscanf(attrib, "HRD=%30u", &val) == 1) {
         format_attr->format_attr[H263_ATTR_KEY_HRD] = val;
      } else if (sscanf(attrib, "P=%30u,%30u,%30u,%30u", &val, &val2, &val3, &val4) > 0) {
         format_attr->format_attr[H263_ATTR_KEY_P_SUB1] = val;
         format_attr->format_attr[H263_ATTR_KEY_P_SUB2] = val2;
         format_attr->format_attr[H263_ATTR_KEY_P_SUB3] = val3;
         format_attr->format_attr[H263_ATTR_KEY_P_SUB4] = val4;
      }
   }

   return 0;
}

Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "H.263 Format Attribute Module" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 295 of file res_format_attr_h263.c.

Definition at line 295 of file res_format_attr_h263.c.