/* * Generate default attribute. */ static pj_status_t openh264_default_attr( pjmedia_vid_codec_factory *factory, const pjmedia_vid_codec_info *info, pjmedia_vid_codec_param *attr ) { const openh264_codec_desc *desc; unsigned i; PJ_ASSERT_RETURN(factory==&openh264_factory.base, PJ_EINVAL); PJ_ASSERT_RETURN(info && attr, PJ_EINVAL); desc = find_codec_desc_by_info(info); if (!desc) { return PJMEDIA_CODEC_EUNSUP; } pj_bzero(attr, sizeof(pjmedia_vid_codec_param)); /* Scan the requested packings and use the lowest number */ attr->packing = 0; for (i=0; i<15; ++i) { unsigned packing = (1 << i); if ((desc->info.packings & info->packings) & packing) { attr->packing = (pjmedia_vid_packing)packing; break; } } if (attr->packing == 0) { /* No supported packing in info */ return PJMEDIA_CODEC_EUNSUP; } /* Direction */ attr->dir = desc->info.dir; /* Encoded format */ pjmedia_format_init_video(&attr->enc_fmt, desc->info.fmt_id, desc->size.w, desc->size.h, desc->fps.num, desc->fps.denum); /* Decoded format */ pjmedia_format_init_video(&attr->dec_fmt, desc->info.dec_fmt_id[0], desc->size.w, desc->size.h, desc->fps.num, desc->fps.denum); /* Decoding fmtp */ attr->dec_fmtp = desc->dec_fmtp; /* Bitrate */ attr->enc_fmt.det.vid.avg_bps = desc->avg_bps; attr->enc_fmt.det.vid.max_bps = desc->max_bps; /* Encoding MTU */ attr->enc_mtu = PJMEDIA_MAX_VID_PAYLOAD_SIZE; return PJ_SUCCESS; }
static pj_status_t alt_vid_codec_default_attr( pjmedia_vid_codec_factory *factory, const pjmedia_vid_codec_info *info, pjmedia_vid_codec_param *attr ) { const struct alt_codec_desc *desc = find_codec_desc_by_info(info); unsigned i; if (!desc) return PJMEDIA_CODEC_EUNSUP; pj_bzero(attr, sizeof(pjmedia_vid_codec_param)); /* Scan the requested packings and use the lowest number */ attr->packing = 0; for (i=0; i<15; ++i) { unsigned packing = (1 << i); if ((desc->info.packings & info->packings) & packing) { attr->packing = (pjmedia_vid_packing)packing; break; } } if (attr->packing == 0) { /* No supported packing in info */ return PJMEDIA_CODEC_EUNSUP; } /* Direction */ attr->dir = desc->info.dir; /* Encoded format */ pjmedia_format_init_video(&attr->enc_fmt, desc->info.fmt_id, 720, 480, 30000, 1001); /* Decoded format */ pjmedia_format_init_video(&attr->dec_fmt, desc->info.dec_fmt_id[0], //352, 288, 30000, 1001); 720, 576, 30000, 1001); /* Decoding fmtp */ attr->dec_fmtp = desc->dec_fmtp; /* Bitrate */ attr->enc_fmt.det.vid.avg_bps = desc->avg_bps; attr->enc_fmt.det.vid.max_bps = desc->max_bps; /* MTU */ attr->enc_mtu = PJMEDIA_MAX_MTU; return PJ_SUCCESS; }
/* * Check if factory can allocate the specified codec. */ static pj_status_t openh264_test_alloc( pjmedia_vid_codec_factory *factory, const pjmedia_vid_codec_info *info ) { const openh264_codec_desc *desc; PJ_ASSERT_RETURN(factory==&openh264_factory.base, PJ_EINVAL); PJ_ASSERT_RETURN(info, PJ_EINVAL); desc = find_codec_desc_by_info(info); if (!desc) { return PJMEDIA_CODEC_EUNSUP; } return PJ_SUCCESS; }
/* * Allocate a new codec instance. */ static pj_status_t openh264_alloc_codec( pjmedia_vid_codec_factory *factory, const pjmedia_vid_codec_info *info, pjmedia_vid_codec **p_codec) { openh264_private *ff; const openh264_codec_desc *desc; pjmedia_vid_codec *codec; pj_pool_t *pool = NULL; pj_status_t status = PJ_SUCCESS; PJ_ASSERT_RETURN(factory && info && p_codec, PJ_EINVAL); PJ_ASSERT_RETURN(factory == &openh264_factory.base, PJ_EINVAL); desc = find_codec_desc_by_info(info); if (!desc) { return PJMEDIA_CODEC_EUNSUP; } /* Create pool for codec instance */ pool = pj_pool_create(openh264_factory.pf, "openh264 codec", 512, 512, NULL); codec = PJ_POOL_ZALLOC_T(pool, pjmedia_vid_codec); if (!codec) { status = PJ_ENOMEM; goto on_error; } codec->op = &openh264_op; codec->factory = factory; ff = PJ_POOL_ZALLOC_T(pool, openh264_private); if (!ff) { status = PJ_ENOMEM; goto on_error; } codec->codec_data = ff; ff->pool = pool; ff->desc = desc; ff->enc_expected_size.w = 0; ff->enc_expected_size.h = 0; ff->dec = NULL; ff->enc = NULL; *p_codec = codec; return PJ_SUCCESS; on_error: if (pool) pj_pool_release(pool); return status; }
static pj_status_t alt_vid_codec_test_alloc( pjmedia_vid_codec_factory *factory, const pjmedia_vid_codec_info *id ) { const struct alt_codec_desc *desc = find_codec_desc_by_info(id); return desc? PJ_SUCCESS : PJMEDIA_CODEC_EUNSUP; }