1
0
Fork 0
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:
winlin 2015-02-10 22:37:29 +08:00
parent 66931a8890
commit 87519aaae8
3 changed files with 48 additions and 10 deletions

View file

@ -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"

View file

@ -199,6 +199,7 @@ SrsAvcAacCodec::SrsAvcAacCodec()
pictureParameterSetLength = 0; pictureParameterSetLength = 0;
pictureParameterSetNALUnit = NULL; pictureParameterSetNALUnit = NULL;
payload_format = SrsAvcPayloadFormatGuess;
stream = new SrsStream(); stream = new SrsStream();
} }
@ -469,20 +470,42 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample
srs_error("avc decode failed, sequence header not found. ret=%d", ret); srs_error("avc decode failed, sequence header not found. ret=%d", ret);
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.

View file

@ -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