fix the avc codec bug, the ibmf format may like the annexb, we must guess only one time. 2.0.114
正在显示
3 个修改的文件
包含
48 行增加
和
10 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论