]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7517: Reset context->nalu_28_start on mark bit - This makes FU-A parsing work
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 9 Dec 2014 21:19:05 +0000 (15:19 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:51 +0000 (12:46 -0500)
src/mod/applications/mod_av/mod_av.c
src/mod/codecs/mod_openh264/mod_openh264.cpp

index 5035faf97b3edbcb8488becc822e11751cd426e6..3e388b316ac5191f90946c9fa5cacd887e429c31 100644 (file)
@@ -255,6 +255,7 @@ static void buffer_h264_nalu(h264_codec_context_t *context, switch_frame_t *fram
 
        if (frame->m) {
                switch_buffer_write(buffer, ff_input_buffer_padding, sizeof(ff_input_buffer_padding));
+               context->nalu_28_start = 0;
        }
 }
 
@@ -717,6 +718,7 @@ static switch_status_t switch_h264_decode(switch_codec_t *codec, switch_frame_t
                }
 
                switch_buffer_zero(context->nalu_buffer);
+               context->nalu_28_start = 0;
                //switch_set_flag(frame, SFF_USE_VIDEO_TIMESTAMP);
                return SWITCH_STATUS_SUCCESS;
        }
index 8735b03441c79fac24c8d3487215f8bf801234dd..c169cfcef99a60cc4f6484384675df1f46591661 100644 (file)
@@ -34,7 +34,7 @@
 
 #define EPSN (0.000001f) // (1e-6)     // desired float precision
 #define PESN (0.000001f) // (1e-6)     // desired float precision
-#define MT_ENABLED
+//#define MT_ENABLED
 
 #include "codec_api.h"
 //#include "inc/logging.h"     // for debug
@@ -76,7 +76,7 @@ int FillSpecificParameters(SEncParamExt& param) {
        /* Test for temporal, spatial, SNR scalability */
        param.iPicWidth                 = 1280;          // width of picture in samples
        param.iPicHeight                = 720;           // height of picture in samples
-       param.iTargetBitrate        = 1280 * 720 * 8; // target bitrate desired
+       param.iTargetBitrate        = 1250000;//1280 * 720 * 8; // target bitrate desired
        param.iRCMode               = RC_QUALITY_MODE;         //  rc mode control
        param.iTemporalLayerNum     = 1;         // layer number at temporal level
        param.iSpatialLayerNum      = 1;         // layer number at spatial level
@@ -104,8 +104,8 @@ int FillSpecificParameters(SEncParamExt& param) {
        param.sSpatialLayers[iIndexLayer].iVideoHeight  = 720;
        param.sSpatialLayers[iIndexLayer].fFrameRate    = (double) (FPS * 1.0f);
        // param.sSpatialLayers[iIndexLayer].iQualityLayerNum = 1;
-       param.sSpatialLayers[iIndexLayer].iSpatialBitrate  = 1250000;//1280 * 720 * 8;
-       //param.sSpatialLayers[iIndexLayer].iMaxSpatialBitrate  = 1250000;
+       param.sSpatialLayers[iIndexLayer].iSpatialBitrate  = param.iTargetBitrate;
+       //param.sSpatialLayers[iIndexLayer].iMaxSpatialBitrate  = param.iTargetBitrate;
        //param.sSpatialLayers[iIndexLayer].uiLevelIdc = LEVEL_1_3;
        param.sSpatialLayers[iIndexLayer].uiProfileIdc = PRO_BASELINE;
 
@@ -163,15 +163,19 @@ static switch_size_t buffer_h264_nalu(h264_codec_context_t *context, switch_fram
        nalu_type = nalu_hdr & 0x1f;
 
        if (!context->got_sps && nalu_type != 7) {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Waiting SPS/PPS\n");
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Waiting SPS/PPS, Got %d\n", nalu_type);
                return 0;
        }
 
-       if (!context->got_sps) context->got_sps = 1;
+       if (!context->got_sps) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found SPS/PPS\n");
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "=========================================================================================\n");
+               context->got_sps = 1;
+       }
 
        /* hack for phones sending sps/pps with frame->m = 1 such as grandstream */
        if ((nalu_type == 7 || nalu_type == 8) && frame->m) frame->m = SWITCH_FALSE;
-
+       
        if (nalu_type == 28) { // 0x1c FU-A
                nalu_type = *(data + 1) & 0x1f;
 
@@ -191,6 +195,8 @@ static switch_size_t buffer_h264_nalu(h264_codec_context_t *context, switch_fram
                context->nalu_28_start = 0;
        }
 
+       if (frame->m) context->nalu_28_start = 0;
+
 #ifdef DEBUG_H264
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "ts: %ld len: %4d %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x mark=%d size=%" SWITCH_SIZE_T_FMT "\n",
                (frame)->timestamp, (frame)->datalen,
@@ -396,7 +402,7 @@ static switch_status_t init_encoder(h264_codec_context_t *context, uint32_t widt
 
        context->encoder_params.iPicWidth = width;
        context->encoder_params.iPicHeight = height;
-
+       //context->encoder_params.iTargetBitrate = width * height * 8;
        for (int i=0; i<context->encoder_params.iSpatialLayerNum; i++) {
                context->encoder_params.sSpatialLayers[i].iVideoWidth = width;
                context->encoder_params.sSpatialLayers[i].iVideoHeight = height;
@@ -495,7 +501,7 @@ static switch_status_t switch_h264_decode(switch_codec_t *codec, switch_frame_t
 
        // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "len: %d ts: %u mark:%d\n", frame->datalen, ntohl(frame->timestamp), frame->m);
 
-       if (0 && context->last_received_timestamp && context->last_received_timestamp != frame->timestamp &&
+       if (context->last_received_timestamp && context->last_received_timestamp != frame->timestamp &&
                (!frame->m) && (!context->last_received_complete_picture)) {
                // possible packet loss
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Packet Loss, skip privousely received packets\n");
@@ -561,6 +567,7 @@ static switch_status_t switch_h264_decode(switch_codec_t *codec, switch_frame_t
                }
                //switch_set_flag(frame, SFF_USE_VIDEO_TIMESTAMP);
                switch_buffer_zero(context->nalu_buffer);
+               context->nalu_28_start = 0;
                status = SWITCH_STATUS_SUCCESS;
        }
 
@@ -573,6 +580,8 @@ end:
        if (status == SWITCH_STATUS_RESTART) {
                context->got_sps = 0;
                switch_buffer_zero(context->nalu_buffer);
+               context->nalu_28_start = 0;
+
 #if 0
                /* re-initialize decoder, trying to recover from really bad H264 bit streams */
                if (context->decoder->Initialize(&context->decoder_params)) {