summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-08-03 07:08:07 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-08-03 07:08:07 +0000
commit0c02f3847f89a52537fa6663343621523d8d4ce6 (patch)
tree25dc7dc0c42357175bf1cea59a8acc734ad8819f
parent8d5a0c465d07037bd800d0369a0cfdb72d9e49dd (diff)
Fixed #1947: Support for OpenH264 v1.6.0 codec
Thanks to Marc Etcheverry for the patch. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5405 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/src/pjmedia-codec/openh264.cpp87
1 files changed, 44 insertions, 43 deletions
diff --git a/pjmedia/src/pjmedia-codec/openh264.cpp b/pjmedia/src/pjmedia-codec/openh264.cpp
index 4eeb2570..f5f03c8c 100644
--- a/pjmedia/src/pjmedia-codec/openh264.cpp
+++ b/pjmedia/src/pjmedia-codec/openh264.cpp
@@ -163,8 +163,8 @@ typedef struct oh264_codec_data
struct SLayerPEncCtx
{
- pj_int32_t iDLayerQp;
- SSliceConfig sSliceCfg;
+ pj_int32_t iDLayerQp;
+ SSliceArgument sSliceArgument;
};
PJ_DEF(pj_status_t) pjmedia_codec_openh264_vid_init(pjmedia_vid_codec_mgr *mgr,
@@ -470,18 +470,19 @@ static pj_status_t oh264_codec_open(pjmedia_vid_codec *codec,
*/
/* Init encoder parameters */
- pj_bzero(&eprm, sizeof(eprm));
- eprm.iInputCsp = videoFormatI420;
+ oh264_data->enc->GetDefaultParams (&eprm);
+ eprm.iComplexityMode = MEDIUM_COMPLEXITY;
eprm.sSpatialLayers[0].uiProfileIdc = PRO_BASELINE;
eprm.iPicWidth = param->enc_fmt.det.vid.size.w;
+ eprm.iUsageType = CAMERA_VIDEO_REAL_TIME;
eprm.iPicHeight = param->enc_fmt.det.vid.size.h;
eprm.fMaxFrameRate = (param->enc_fmt.det.vid.fps.num *
1.0f /
param->enc_fmt.det.vid.fps.denum);
- eprm.uiFrameToBeCoded = (unsigned int) -1;
eprm.iTemporalLayerNum = 1;
eprm.uiIntraPeriod = 0; /* I-Frame interval in frames */
- eprm.bEnableSpsPpsIdAddition = (oh264_data->whole? false : true);
+ eprm.eSpsPpsIdStrategy = (oh264_data->whole ? CONSTANT_ID :
+ INCREASING_ID);
eprm.bEnableFrameCroppingFlag = true;
eprm.iLoopFilterDisableIdc = 0;
eprm.iLoopFilterAlphaC0Offset = 0;
@@ -504,18 +505,19 @@ static pj_status_t oh264_codec_open(pjmedia_vid_codec *codec,
pj_bzero(&elayer_ctx, sizeof (SLayerPEncCtx));
elayer_ctx.iDLayerQp = 24;
- elayer_ctx.sSliceCfg.uiSliceMode = (oh264_data->whole ?
- SM_SINGLE_SLICE : SM_DYN_SLICE);
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceSizeConstraint = param->enc_mtu;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceNum = 1;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[0] = 960;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[1] = 0;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[2] = 0;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[3] = 0;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[4] = 0;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[5] = 0;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[6] = 0;
- elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[7] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMode = (oh264_data->whole ?
+ SM_SINGLE_SLICE :
+ SM_SIZELIMITED_SLICE);
+ elayer_ctx.sSliceArgument.uiSliceSizeConstraint = param->enc_mtu;
+ elayer_ctx.sSliceArgument.uiSliceNum = 1;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[0] = 960;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[1] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[2] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[3] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[4] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[5] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[6] = 0;
+ elayer_ctx.sSliceArgument.uiSliceMbNum[7] = 0;
elayer->iVideoWidth = eprm.iPicWidth;
elayer->iVideoHeight = eprm.iPicHeight;
@@ -523,14 +525,14 @@ static pj_status_t oh264_codec_open(pjmedia_vid_codec *codec,
elayer->uiProfileIdc = eprm.sSpatialLayers[0].uiProfileIdc;
elayer->iSpatialBitrate = eprm.iTargetBitrate;
elayer->iDLayerQp = elayer_ctx.iDLayerQp;
- elayer->sSliceCfg.uiSliceMode = elayer_ctx.sSliceCfg.uiSliceMode;
+ elayer->sSliceArgument.uiSliceMode = elayer_ctx.sSliceArgument.uiSliceMode;
- memcpy( &elayer->sSliceCfg,
- &elayer_ctx.sSliceCfg,
- sizeof (SSliceConfig));
- memcpy( &elayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0],
- &elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum[0],
- sizeof (elayer_ctx.sSliceCfg.sSliceArgument.uiSliceMbNum));
+ memcpy ( &elayer->sSliceArgument,
+ &elayer_ctx.sSliceArgument,
+ sizeof (SSliceArgument));
+ memcpy ( &elayer->sSliceArgument.uiSliceMbNum[0],
+ &elayer_ctx.sSliceArgument.uiSliceMbNum[0],
+ sizeof (elayer_ctx.sSliceArgument.uiSliceMbNum));
/* Init input picture */
oh264_data->esrc_pic->iColorFormat = videoFormatI420;
@@ -552,13 +554,20 @@ static pj_status_t oh264_codec_open(pjmedia_vid_codec *codec,
return PJMEDIA_CODEC_EFAILED;
}
+ int videoFormat = videoFormatI420;
+ rc = oh264_data->enc->SetOption (ENCODER_OPTION_DATAFORMAT, &videoFormat);
+ if (rc != cmResultSuccess) {
+ PJ_LOG(4,(THIS_FILE, "SVC encoder SetOption videoFormatI420 failed, "
+ "rc=%d", rc));
+ return PJMEDIA_CODEC_EFAILED;
+ }
+
/*
* Decoder
*/
sDecParam.sVideoProperty.size = sizeof (sDecParam.sVideoProperty);
- sDecParam.iOutputColorFormat = videoFormatI420;
sDecParam.uiTargetDqLayer = (pj_uint8_t) - 1;
- sDecParam.uiEcActiveFlag = 1;
+ sDecParam.eEcActiveIdc = ERROR_CON_SLICE_COPY;
sDecParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
//TODO:
@@ -576,14 +585,6 @@ static pj_status_t oh264_codec_open(pjmedia_vid_codec *codec,
return PJMEDIA_CODEC_EFAILED;
}
- pj_int32_t color_fmt = videoFormatI420;
- rc = oh264_data->dec->SetOption (DECODER_OPTION_DATAFORMAT, &color_fmt);
- if (rc) {
- PJ_LOG(4,(THIS_FILE,
- "Warning: SetOption(DECODER_OPTION_DATAFORMAT) failed, rc=%d",
- rc));
- }
-
oh264_data->dec_buf_size = (MAX_RX_WIDTH * MAX_RX_HEIGHT * 3 >> 1) +
(MAX_RX_WIDTH);
oh264_data->dec_buf = (pj_uint8_t*)pj_pool_alloc(oh264_data->pool,
@@ -661,7 +662,7 @@ static pj_status_t oh264_codec_encode_begin(pjmedia_vid_codec *codec,
return PJMEDIA_CODEC_EFAILED;
}
- if (oh264_data->bsi.eOutputFrameType == videoFrameTypeSkip) {
+ if (oh264_data->bsi.eFrameType == videoFrameTypeSkip) {
output->size = 0;
output->type = PJMEDIA_FRAME_TYPE_NONE;
output->timestamp = input->timestamp;
@@ -681,13 +682,13 @@ static pj_status_t oh264_codec_encode_begin(pjmedia_vid_codec *codec,
/* Find which layer with biggest payload */
oh264_data->ilayer = 0;
- payload_size = oh264_data->bsi.sLayerInfo[0].iNalLengthInByte[0];
+ payload_size = oh264_data->bsi.sLayerInfo[0].pNalLengthInByte[0];
for (i=0; i < (unsigned)oh264_data->bsi.iLayerNum; ++i) {
unsigned j;
pLayerBsInfo = &oh264_data->bsi.sLayerInfo[i];
for (j=0; j < (unsigned)pLayerBsInfo->iNalCount; ++j) {
- if (pLayerBsInfo->iNalLengthInByte[j] > (int)payload_size) {
- payload_size = pLayerBsInfo->iNalLengthInByte[j];
+ if (pLayerBsInfo->pNalLengthInByte[j] > (int)payload_size) {
+ payload_size = pLayerBsInfo->pNalLengthInByte[j];
oh264_data->ilayer = i;
}
}
@@ -703,7 +704,7 @@ static pj_status_t oh264_codec_encode_begin(pjmedia_vid_codec *codec,
payload = pLayerBsInfo->pBsBuf;
payload_size = 0;
for (int inal = pLayerBsInfo->iNalCount - 1; inal >= 0; --inal) {
- payload_size += pLayerBsInfo->iNalLengthInByte[inal];
+ payload_size += pLayerBsInfo->pNalLengthInByte[inal];
}
if (payload_size > out_size)
@@ -760,7 +761,7 @@ static pj_status_t oh264_codec_encode_more(pjmedia_vid_codec *codec,
pj_memcpy(output->buf, payload, payload_len);
output->size = payload_len;
- if (oh264_data->bsi.eOutputFrameType == videoFrameTypeIDR) {
+ if (oh264_data->bsi.eFrameType == videoFrameTypeIDR) {
output->bit_info |= PJMEDIA_VID_FRM_KEYFRAME;
}
@@ -782,7 +783,7 @@ static pj_status_t oh264_codec_encode_more(pjmedia_vid_codec *codec,
oh264_data->enc_frame_size = 0;
for (int inal = pLayerBsInfo->iNalCount - 1; inal >= 0; --inal) {
- oh264_data->enc_frame_size += pLayerBsInfo->iNalLengthInByte[inal];
+ oh264_data->enc_frame_size += pLayerBsInfo->pNalLengthInByte[inal];
}
oh264_data->enc_frame_whole = pLayerBsInfo->pBsBuf;
@@ -809,7 +810,7 @@ static pj_status_t oh264_codec_encode_more(pjmedia_vid_codec *codec,
pj_memcpy(output->buf, payload, payload_len);
output->size = payload_len;
- if (oh264_data->bsi.eOutputFrameType == videoFrameTypeIDR) {
+ if (oh264_data->bsi.eFrameType == videoFrameTypeIDR) {
output->bit_info |= PJMEDIA_VID_FRM_KEYFRAME;
}