mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
fix the avc codec bug, the ibmf format may like the annexb, we must guess only one time. 2.0.114
This commit is contained in:
parent
66931a8890
commit
87519aaae8
3 changed files with 48 additions and 10 deletions
|
@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
// current release version
|
// current release version
|
||||||
#define VERSION_MAJOR 2
|
#define VERSION_MAJOR 2
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 113
|
#define VERSION_REVISION 114
|
||||||
|
|
||||||
// server info.
|
// server info.
|
||||||
#define RTMP_SIG_SRS_KEY "SRS"
|
#define RTMP_SIG_SRS_KEY "SRS"
|
||||||
|
|
|
@ -199,6 +199,7 @@ SrsAvcAacCodec::SrsAvcAacCodec()
|
||||||
pictureParameterSetLength = 0;
|
pictureParameterSetLength = 0;
|
||||||
pictureParameterSetNALUnit = NULL;
|
pictureParameterSetNALUnit = NULL;
|
||||||
|
|
||||||
|
payload_format = SrsAvcPayloadFormatGuess;
|
||||||
stream = new SrsStream();
|
stream = new SrsStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,19 +471,41 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// One or more NALUs (Full frames are required)
|
// guess for the first time.
|
||||||
// try "AnnexB" from H.264-AVC-ISO_IEC_14496-10.pdf, page 211.
|
if (payload_format == SrsAvcPayloadFormatGuess) {
|
||||||
if ((ret = avc_demux_annexb_format(stream, sample)) != ERROR_SUCCESS) {
|
// One or more NALUs (Full frames are required)
|
||||||
// stop try when system error.
|
// try "AnnexB" from H.264-AVC-ISO_IEC_14496-10.pdf, page 211.
|
||||||
if (ret != ERROR_HLS_AVC_TRY_OTHERS) {
|
if ((ret = avc_demux_annexb_format(stream, sample)) != ERROR_SUCCESS) {
|
||||||
srs_error("avc demux for annexb failed. ret=%d", ret);
|
// stop try when system error.
|
||||||
return ret;
|
if (ret != ERROR_HLS_AVC_TRY_OTHERS) {
|
||||||
}
|
srs_error("avc demux for annexb failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// try "ISO Base Media File Format" from H.264-AVC-ISO_IEC_14496-15.pdf, page 20
|
||||||
|
if ((ret = avc_demux_ibmf_format(stream, sample)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
payload_format = SrsAvcPayloadFormatIbmf;
|
||||||
|
srs_info("hls guess avc payload is ibmf format.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
payload_format = SrsAvcPayloadFormatAnnexb;
|
||||||
|
srs_info("hls guess avc payload is annexb format.");
|
||||||
|
}
|
||||||
|
} else if (payload_format == SrsAvcPayloadFormatIbmf) {
|
||||||
// try "ISO Base Media File Format" from H.264-AVC-ISO_IEC_14496-15.pdf, page 20
|
// try "ISO Base Media File Format" from H.264-AVC-ISO_IEC_14496-15.pdf, page 20
|
||||||
if ((ret = avc_demux_ibmf_format(stream, sample)) != ERROR_SUCCESS) {
|
if ((ret = avc_demux_ibmf_format(stream, sample)) != ERROR_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
srs_info("hls decode avc payload in ibmf format.");
|
||||||
|
} else {
|
||||||
|
// One or more NALUs (Full frames are required)
|
||||||
|
// try "AnnexB" from H.264-AVC-ISO_IEC_14496-10.pdf, page 211.
|
||||||
|
if ((ret = avc_demux_annexb_format(stream, sample)) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_info("hls decode avc payload in annexb format.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// ignored.
|
// ignored.
|
||||||
|
|
|
@ -358,6 +358,18 @@ public:
|
||||||
int add_sample_unit(char* bytes, int size);
|
int add_sample_unit(char* bytes, int size);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the avc payload format, must be ibmf or annexb format.
|
||||||
|
* we guess by annexb first, then ibmf for the first time,
|
||||||
|
* and we always use the guessed format for the next time.
|
||||||
|
*/
|
||||||
|
enum SrsAvcPayloadFormat
|
||||||
|
{
|
||||||
|
SrsAvcPayloadFormatGuess = 0,
|
||||||
|
SrsAvcPayloadFormatAnnexb,
|
||||||
|
SrsAvcPayloadFormatIbmf,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the h264/avc and aac codec, for media stream.
|
* the h264/avc and aac codec, for media stream.
|
||||||
*
|
*
|
||||||
|
@ -404,6 +416,9 @@ public:
|
||||||
char* sequenceParameterSetNALUnit;
|
char* sequenceParameterSetNALUnit;
|
||||||
u_int16_t pictureParameterSetLength;
|
u_int16_t pictureParameterSetLength;
|
||||||
char* pictureParameterSetNALUnit;
|
char* pictureParameterSetNALUnit;
|
||||||
|
private:
|
||||||
|
// the avc payload format.
|
||||||
|
SrsAvcPayloadFormat payload_format;
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* audio specified
|
* audio specified
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue