winlin

fix the avc codec bug, the ibmf format may like the annexb, we must guess only one time. 2.0.114

@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR 2 32 #define VERSION_MAJOR 2
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 113 34 +#define VERSION_REVISION 114
35 35
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"
@@ -199,6 +199,7 @@ SrsAvcAacCodec::SrsAvcAacCodec() @@ -199,6 +199,7 @@ SrsAvcAacCodec::SrsAvcAacCodec()
199 pictureParameterSetLength = 0; 199 pictureParameterSetLength = 0;
200 pictureParameterSetNALUnit = NULL; 200 pictureParameterSetNALUnit = NULL;
201 201
  202 + payload_format = SrsAvcPayloadFormatGuess;
202 stream = new SrsStream(); 203 stream = new SrsStream();
203 } 204 }
204 205
@@ -469,20 +470,42 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample @@ -469,20 +470,42 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample
469 srs_error("avc decode failed, sequence header not found. ret=%d", ret); 470 srs_error("avc decode failed, sequence header not found. ret=%d", ret);
470 return ret; 471 return ret;
471 } 472 }
472 -  
473 - // One or more NALUs (Full frames are required)  
474 - // try "AnnexB" from H.264-AVC-ISO_IEC_14496-10.pdf, page 211.  
475 - if ((ret = avc_demux_annexb_format(stream, sample)) != ERROR_SUCCESS) {  
476 - // stop try when system error.  
477 - if (ret != ERROR_HLS_AVC_TRY_OTHERS) {  
478 - srs_error("avc demux for annexb failed. ret=%d", ret);  
479 - return ret; 473 +
  474 + // guess for the first time.
  475 + if (payload_format == SrsAvcPayloadFormatGuess) {
  476 + // One or more NALUs (Full frames are required)
  477 + // try "AnnexB" from H.264-AVC-ISO_IEC_14496-10.pdf, page 211.
  478 + if ((ret = avc_demux_annexb_format(stream, sample)) != ERROR_SUCCESS) {
  479 + // stop try when system error.
  480 + if (ret != ERROR_HLS_AVC_TRY_OTHERS) {
  481 + srs_error("avc demux for annexb failed. ret=%d", ret);
  482 + return ret;
  483 + }
  484 +
  485 + // try "ISO Base Media File Format" from H.264-AVC-ISO_IEC_14496-15.pdf, page 20
  486 + if ((ret = avc_demux_ibmf_format(stream, sample)) != ERROR_SUCCESS) {
  487 + return ret;
  488 + } else {
  489 + payload_format = SrsAvcPayloadFormatIbmf;
  490 + srs_info("hls guess avc payload is ibmf format.");
  491 + }
  492 + } else {
  493 + payload_format = SrsAvcPayloadFormatAnnexb;
  494 + srs_info("hls guess avc payload is annexb format.");
480 } 495 }
481 - 496 + } else if (payload_format == SrsAvcPayloadFormatIbmf) {
482 // try "ISO Base Media File Format" from H.264-AVC-ISO_IEC_14496-15.pdf, page 20 497 // try "ISO Base Media File Format" from H.264-AVC-ISO_IEC_14496-15.pdf, page 20
483 if ((ret = avc_demux_ibmf_format(stream, sample)) != ERROR_SUCCESS) { 498 if ((ret = avc_demux_ibmf_format(stream, sample)) != ERROR_SUCCESS) {
484 return ret; 499 return ret;
485 } 500 }
  501 + srs_info("hls decode avc payload in ibmf format.");
  502 + } else {
  503 + // One or more NALUs (Full frames are required)
  504 + // try "AnnexB" from H.264-AVC-ISO_IEC_14496-10.pdf, page 211.
  505 + if ((ret = avc_demux_annexb_format(stream, sample)) != ERROR_SUCCESS) {
  506 + return ret;
  507 + }
  508 + srs_info("hls decode avc payload in annexb format.");
486 } 509 }
487 } else { 510 } else {
488 // ignored. 511 // ignored.
@@ -359,6 +359,18 @@ public: @@ -359,6 +359,18 @@ public:
359 }; 359 };
360 360
361 /** 361 /**
  362 +* the avc payload format, must be ibmf or annexb format.
  363 +* we guess by annexb first, then ibmf for the first time,
  364 +* and we always use the guessed format for the next time.
  365 +*/
  366 +enum SrsAvcPayloadFormat
  367 +{
  368 + SrsAvcPayloadFormatGuess = 0,
  369 + SrsAvcPayloadFormatAnnexb,
  370 + SrsAvcPayloadFormatIbmf,
  371 +};
  372 +
  373 +/**
362 * the h264/avc and aac codec, for media stream. 374 * the h264/avc and aac codec, for media stream.
363 * 375 *
364 * to demux the FLV/RTMP video/audio packet to sample, 376 * to demux the FLV/RTMP video/audio packet to sample,
@@ -404,6 +416,9 @@ public: @@ -404,6 +416,9 @@ public:
404 char* sequenceParameterSetNALUnit; 416 char* sequenceParameterSetNALUnit;
405 u_int16_t pictureParameterSetLength; 417 u_int16_t pictureParameterSetLength;
406 char* pictureParameterSetNALUnit; 418 char* pictureParameterSetNALUnit;
  419 +private:
  420 + // the avc payload format.
  421 + SrsAvcPayloadFormat payload_format;
407 public: 422 public:
408 /** 423 /**
409 * audio specified 424 * audio specified