mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Fix #1405: Restore the stream when parsing failed. v5.0.59
This commit is contained in:
parent
ef04d411c0
commit
6988e60ad6
4 changed files with 47 additions and 43 deletions
|
@ -7,6 +7,7 @@ The changelog for SRS.
|
||||||
|
|
||||||
## SRS 5.0 Changelog
|
## SRS 5.0 Changelog
|
||||||
|
|
||||||
|
* v5.0, 2022-09-01, Fix [#1405](https://github.com/ossrs/srs/issues/1405): Restore the stream when parsing failed. v5.0.59
|
||||||
* v5.0, 2022-09-01, Fix [#1405](https://github.com/ossrs/srs/issues/1405): Support guessing IBMF first. v5.0.58
|
* v5.0, 2022-09-01, Fix [#1405](https://github.com/ossrs/srs/issues/1405): Support guessing IBMF first. v5.0.58
|
||||||
* v5.0, 2022-09-01, ST: Define and use a new jmpbuf. v5.0.57
|
* v5.0, 2022-09-01, ST: Define and use a new jmpbuf. v5.0.57
|
||||||
* v5.0, 2022-08-31, Fix URL parsing bug for `__defaultVhost__`. v5.0.56
|
* v5.0, 2022-08-31, Fix URL parsing bug for `__defaultVhost__`. v5.0.56
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
|
|
||||||
#define VERSION_MAJOR 5
|
#define VERSION_MAJOR 5
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 58
|
#define VERSION_REVISION 59
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1137,53 +1137,24 @@ srs_error_t SrsFormat::video_nalu_demux(SrsBuffer* stream)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// guess for the first time.
|
// Parse the SPS/PPS in ANNEXB or IBMF format.
|
||||||
if (vcodec->payload_format == SrsAvcPayloadFormatGuess) {
|
if (vcodec->payload_format == SrsAvcPayloadFormatIbmf) {
|
||||||
if (try_annexb_first) {
|
|
||||||
// One or more NALUs (Full frames are required)
|
|
||||||
// try "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
|
||||||
if ((err = avc_demux_annexb_format(stream)) != srs_success) {
|
|
||||||
srs_freep(err);
|
|
||||||
|
|
||||||
// try "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
|
|
||||||
if ((err = avc_demux_ibmf_format(stream)) != srs_success) {
|
if ((err = avc_demux_ibmf_format(stream)) != srs_success) {
|
||||||
return srs_error_wrap(err, "avc demux ibmf");
|
return srs_error_wrap(err, "avc demux ibmf");
|
||||||
} else {
|
|
||||||
vcodec->payload_format = SrsAvcPayloadFormatIbmf;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else if (vcodec->payload_format == SrsAvcPayloadFormatAnnexb) {
|
||||||
vcodec->payload_format = SrsAvcPayloadFormatAnnexb;
|
if ((err = avc_demux_annexb_format(stream)) != srs_success) {
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// One or more NALUs (Full frames are required)
|
|
||||||
// try "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
|
||||||
if ((err = avc_demux_ibmf_format(stream)) == srs_success) {
|
|
||||||
vcodec->payload_format = SrsAvcPayloadFormatIbmf;
|
|
||||||
} else {
|
|
||||||
srs_freep(err);
|
|
||||||
if ((err = avc_demux_annexb_format(stream)) == srs_success) {
|
|
||||||
vcodec->payload_format = SrsAvcPayloadFormatAnnexb;
|
|
||||||
} else {
|
|
||||||
return srs_error_wrap(err, "avc demux annexb");
|
return srs_error_wrap(err, "avc demux annexb");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (vcodec->payload_format == SrsAvcPayloadFormatIbmf) {
|
|
||||||
// try "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
|
|
||||||
if ((err = avc_demux_ibmf_format(stream)) != srs_success) {
|
|
||||||
return srs_error_wrap(err, "avc demux ibmf");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// One or more NALUs (Full frames are required)
|
if ((err = try_annexb_first ? avc_demux_annexb_format(stream) : avc_demux_ibmf_format(stream)) == srs_success) {
|
||||||
// try "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
vcodec->payload_format = try_annexb_first ? SrsAvcPayloadFormatAnnexb : SrsAvcPayloadFormatIbmf;
|
||||||
if ((err = avc_demux_annexb_format(stream)) != srs_success) {
|
} else {
|
||||||
srs_freep(err);
|
srs_freep(err);
|
||||||
|
if ((err = try_annexb_first ? avc_demux_ibmf_format(stream) : avc_demux_annexb_format(stream)) == srs_success) {
|
||||||
// try "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
|
vcodec->payload_format = try_annexb_first ? SrsAvcPayloadFormatIbmf : SrsAvcPayloadFormatAnnexb;
|
||||||
if ((err = avc_demux_ibmf_format(stream)) != srs_success) {
|
|
||||||
return srs_error_wrap(err, "avc demux ibmf");
|
|
||||||
} else {
|
} else {
|
||||||
vcodec->payload_format = SrsAvcPayloadFormatIbmf;
|
return srs_error_wrap(err, "avc demux try_annexb_first=%d", try_annexb_first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1195,9 +1166,24 @@ srs_error_t SrsFormat::avc_demux_annexb_format(SrsBuffer* stream)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
int pos = stream->pos();
|
||||||
|
err = do_avc_demux_annexb_format(stream);
|
||||||
|
|
||||||
|
// Restore the stream if error.
|
||||||
|
if (err != srs_success) {
|
||||||
|
stream->skip(pos - stream->pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsFormat::do_avc_demux_annexb_format(SrsBuffer* stream)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
// not annexb, try others
|
// not annexb, try others
|
||||||
if (!srs_avc_startswith_annexb(stream, NULL)) {
|
if (!srs_avc_startswith_annexb(stream, NULL)) {
|
||||||
return srs_error_new(ERROR_HLS_AVC_TRY_OTHERS, "try others");
|
return srs_error_new(ERROR_HLS_DECODE_ERROR, "not annexb");
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnnexB
|
// AnnexB
|
||||||
|
@ -1247,6 +1233,21 @@ srs_error_t SrsFormat::avc_demux_ibmf_format(SrsBuffer* stream)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
int pos = stream->pos();
|
||||||
|
err = do_avc_demux_ibmf_format(stream);
|
||||||
|
|
||||||
|
// Restore the stream if error.
|
||||||
|
if (err != srs_success) {
|
||||||
|
stream->skip(pos - stream->pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsFormat::do_avc_demux_ibmf_format(SrsBuffer* stream)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
int PictureLength = stream->size() - stream->pos();
|
int PictureLength = stream->size() - stream->pos();
|
||||||
|
|
||||||
// 5.3.4.2.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
|
// 5.3.4.2.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
|
||||||
|
|
|
@ -759,8 +759,10 @@ private:
|
||||||
virtual srs_error_t video_nalu_demux(SrsBuffer* stream);
|
virtual srs_error_t video_nalu_demux(SrsBuffer* stream);
|
||||||
// Demux the avc NALU in "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
// Demux the avc NALU in "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
||||||
virtual srs_error_t avc_demux_annexb_format(SrsBuffer* stream);
|
virtual srs_error_t avc_demux_annexb_format(SrsBuffer* stream);
|
||||||
|
virtual srs_error_t do_avc_demux_annexb_format(SrsBuffer* stream);
|
||||||
// Demux the avc NALU in "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
|
// Demux the avc NALU in "ISO Base Media File Format" from ISO_IEC_14496-15-AVC-format-2012.pdf, page 20
|
||||||
virtual srs_error_t avc_demux_ibmf_format(SrsBuffer* stream);
|
virtual srs_error_t avc_demux_ibmf_format(SrsBuffer* stream);
|
||||||
|
virtual srs_error_t do_avc_demux_ibmf_format(SrsBuffer* stream);
|
||||||
private:
|
private:
|
||||||
// Demux the audio packet in AAC codec.
|
// Demux the audio packet in AAC codec.
|
||||||
// Demux the asc from sequence header.
|
// Demux the asc from sequence header.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue