1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Refine srs_kernel_codec audio & video config code (#854)

This commit is contained in:
HungMingWu 2017-04-24 10:08:57 +08:00 committed by winlin
parent c97f2233a2
commit 98d4b6ae11
4 changed files with 38 additions and 58 deletions

View file

@ -137,7 +137,7 @@ int SrsInitMp4::write(SrsFormat* format, bool video, int tid)
SrsMp4AvccBox* avcC = new SrsMp4AvccBox(); SrsMp4AvccBox* avcC = new SrsMp4AvccBox();
avc1->set_avcC(avcC); avc1->set_avcC(avcC);
avcC->avc_config = std::vector<char>(format->vcodec->avc_extra_data, format->vcodec->avc_extra_data + format->vcodec->avc_extra_size); avcC->avc_config = format->vcodec->avc_extra_data;
SrsMp4DecodingTime2SampleBox* stts = new SrsMp4DecodingTime2SampleBox(); SrsMp4DecodingTime2SampleBox* stts = new SrsMp4DecodingTime2SampleBox();
stbl->set_stts(stts); stbl->set_stts(stts);
@ -236,7 +236,7 @@ int SrsInitMp4::write(SrsFormat* format, bool video, int tid)
SrsMp4DecoderSpecificInfo* asc = new SrsMp4DecoderSpecificInfo(); SrsMp4DecoderSpecificInfo* asc = new SrsMp4DecoderSpecificInfo();
desc.decSpecificInfo = asc; desc.decSpecificInfo = asc;
asc->asc = std::vector<char>(format->acodec->aac_extra_data, format->acodec->aac_extra_data + format->acodec->aac_extra_size); asc->asc = format->acodec->aac_extra_data;
SrsMp4DecodingTime2SampleBox* stts = new SrsMp4DecodingTime2SampleBox(); SrsMp4DecodingTime2SampleBox* stts = new SrsMp4DecodingTime2SampleBox();
stbl->set_stts(stts); stbl->set_stts(stts);
@ -610,8 +610,8 @@ int SrsDashController::refresh_init_mp4(SrsSharedPtrMessage* msg, SrsFormat* for
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if (msg->size <= 0 || (msg->is_video() && !format->vcodec->avc_extra_size) if (msg->size <= 0 || (msg->is_video() && format->vcodec->is_avc_codec_ok())
|| (msg->is_audio() && !format->acodec->aac_extra_size)) { || (msg->is_audio() && format->acodec->is_aac_codec_ok())) {
srs_warn("DASH: Ignore empty sequence header."); srs_warn("DASH: Ignore empty sequence header.");
return ret; return ret;
} }

View file

@ -371,8 +371,6 @@ SrsAudioCodecConfig::SrsAudioCodecConfig()
aac_object = SrsAacObjectTypeForbidden; aac_object = SrsAacObjectTypeForbidden;
aac_sample_rate = SrsAacSampleRateUnset; // sample rate ignored aac_sample_rate = SrsAacSampleRateUnset; // sample rate ignored
aac_channels = 0; aac_channels = 0;
aac_extra_size = 0;
aac_extra_data = NULL;
} }
SrsAudioCodecConfig::~SrsAudioCodecConfig() SrsAudioCodecConfig::~SrsAudioCodecConfig()
@ -381,7 +379,7 @@ SrsAudioCodecConfig::~SrsAudioCodecConfig()
bool SrsAudioCodecConfig::is_aac_codec_ok() bool SrsAudioCodecConfig::is_aac_codec_ok()
{ {
return aac_extra_size > 0 && aac_extra_data; return !aac_extra_data.empty();
} }
SrsVideoCodecConfig::SrsVideoCodecConfig() SrsVideoCodecConfig::SrsVideoCodecConfig()
@ -393,30 +391,20 @@ SrsVideoCodecConfig::SrsVideoCodecConfig()
width = 0; width = 0;
height = 0; height = 0;
avc_extra_size = 0;
avc_extra_data = NULL;
NAL_unit_length = 0; NAL_unit_length = 0;
avc_profile = SrsAvcProfileReserved; avc_profile = SrsAvcProfileReserved;
avc_level = SrsAvcLevelReserved; avc_level = SrsAvcLevelReserved;
sequenceParameterSetLength = 0;
sequenceParameterSetNALUnit = NULL;
pictureParameterSetLength = 0;
pictureParameterSetNALUnit = NULL;
payload_format = SrsAvcPayloadFormatGuess; payload_format = SrsAvcPayloadFormatGuess;
} }
SrsVideoCodecConfig::~SrsVideoCodecConfig() SrsVideoCodecConfig::~SrsVideoCodecConfig()
{ {
srs_freepa(avc_extra_data);
srs_freepa(sequenceParameterSetNALUnit);
srs_freepa(pictureParameterSetNALUnit);
} }
bool SrsVideoCodecConfig::is_avc_codec_ok() bool SrsVideoCodecConfig::is_avc_codec_ok()
{ {
return avc_extra_size > 0 && avc_extra_data; return !avc_extra_data.empty();
} }
SrsFrame::SrsFrame() SrsFrame::SrsFrame()
@ -725,11 +713,10 @@ int SrsFormat::avc_demux_sps_pps(SrsBuffer* stream)
// AVCDecoderConfigurationRecord // AVCDecoderConfigurationRecord
// 5.2.4.1.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16 // 5.2.4.1.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
vcodec->avc_extra_size = stream->size() - stream->pos(); int avc_extra_size = stream->size() - stream->pos();
if (vcodec->avc_extra_size > 0) { if (avc_extra_size > 0) {
srs_freepa(vcodec->avc_extra_data); char *copy_stream_from = stream->data() + stream->pos();
vcodec->avc_extra_data = new char[vcodec->avc_extra_size]; vcodec->avc_extra_data = std::vector<char>(copy_stream_from, copy_stream_from + avc_extra_size);
memcpy(vcodec->avc_extra_data, stream->data() + stream->pos(), vcodec->avc_extra_size);
} }
if (!stream->require(6)) { if (!stream->require(6)) {
@ -781,16 +768,15 @@ int SrsFormat::avc_demux_sps_pps(SrsBuffer* stream)
srs_error("avc decode sequenc header sps size failed. ret=%d", ret); srs_error("avc decode sequenc header sps size failed. ret=%d", ret);
return ret; return ret;
} }
vcodec->sequenceParameterSetLength = stream->read_2bytes(); uint16_t sequenceParameterSetLength = stream->read_2bytes();
if (!stream->require(vcodec->sequenceParameterSetLength)) { if (!stream->require(sequenceParameterSetLength)) {
ret = ERROR_HLS_DECODE_ERROR; ret = ERROR_HLS_DECODE_ERROR;
srs_error("avc decode sequenc header sps data failed. ret=%d", ret); srs_error("avc decode sequenc header sps data failed. ret=%d", ret);
return ret; return ret;
} }
if (vcodec->sequenceParameterSetLength > 0) { if (sequenceParameterSetLength > 0) {
srs_freepa(vcodec->sequenceParameterSetNALUnit); vcodec->sequenceParameterSetNALUnit.resize(sequenceParameterSetLength);
vcodec->sequenceParameterSetNALUnit = new char[vcodec->sequenceParameterSetLength]; stream->read_bytes(&vcodec->sequenceParameterSetNALUnit[0], sequenceParameterSetLength);
stream->read_bytes(vcodec->sequenceParameterSetNALUnit, vcodec->sequenceParameterSetLength);
} }
// 1 pps // 1 pps
if (!stream->require(1)) { if (!stream->require(1)) {
@ -810,16 +796,15 @@ int SrsFormat::avc_demux_sps_pps(SrsBuffer* stream)
srs_error("avc decode sequenc header pps size failed. ret=%d", ret); srs_error("avc decode sequenc header pps size failed. ret=%d", ret);
return ret; return ret;
} }
vcodec->pictureParameterSetLength = stream->read_2bytes(); uint16_t pictureParameterSetLength = stream->read_2bytes();
if (!stream->require(vcodec->pictureParameterSetLength)) { if (!stream->require(pictureParameterSetLength)) {
ret = ERROR_HLS_DECODE_ERROR; ret = ERROR_HLS_DECODE_ERROR;
srs_error("avc decode sequenc header pps data failed. ret=%d", ret); srs_error("avc decode sequenc header pps data failed. ret=%d", ret);
return ret; return ret;
} }
if (vcodec->pictureParameterSetLength > 0) { if (pictureParameterSetLength > 0) {
srs_freepa(vcodec->pictureParameterSetNALUnit); vcodec->pictureParameterSetNALUnit.resize(pictureParameterSetLength);
vcodec->pictureParameterSetNALUnit = new char[vcodec->pictureParameterSetLength]; stream->read_bytes(&vcodec->pictureParameterSetNALUnit[0], pictureParameterSetLength);
stream->read_bytes(vcodec->pictureParameterSetNALUnit, vcodec->pictureParameterSetLength);
} }
return avc_demux_sps(); return avc_demux_sps();
@ -829,12 +814,12 @@ int SrsFormat::avc_demux_sps()
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if (!vcodec->sequenceParameterSetLength) { if (vcodec->sequenceParameterSetNALUnit.empty()) {
return ret; return ret;
} }
SrsBuffer stream; SrsBuffer stream;
if ((ret = stream.initialize(vcodec->sequenceParameterSetNALUnit, vcodec->sequenceParameterSetLength)) != ERROR_SUCCESS) { if ((ret = stream.initialize(&vcodec->sequenceParameterSetNALUnit[0], vcodec->sequenceParameterSetNALUnit.size())) != ERROR_SUCCESS) {
return ret; return ret;
} }
@ -876,8 +861,7 @@ int SrsFormat::avc_demux_sps()
// decode the rbsp from sps. // decode the rbsp from sps.
// rbsp[ i ] a raw byte sequence payload is specified as an ordered sequence of bytes. // rbsp[ i ] a raw byte sequence payload is specified as an ordered sequence of bytes.
int8_t* rbsp = new int8_t[vcodec->sequenceParameterSetLength]; std::vector<int8_t> rbsp(vcodec->sequenceParameterSetNALUnit.size());
SrsAutoFreeA(int8_t, rbsp);
int nb_rbsp = 0; int nb_rbsp = 0;
while (!stream.empty()) { while (!stream.empty()) {
@ -898,7 +882,7 @@ int SrsFormat::avc_demux_sps()
nb_rbsp++; nb_rbsp++;
} }
return avc_demux_sps_rbsp((char*)rbsp, nb_rbsp); return avc_demux_sps_rbsp((char*)&rbsp[0], nb_rbsp);
} }
@ -1299,13 +1283,12 @@ int SrsFormat::audio_aac_demux(SrsBuffer* stream, int64_t timestamp)
if (aac_packet_type == SrsAudioAacFrameTraitSequenceHeader) { if (aac_packet_type == SrsAudioAacFrameTraitSequenceHeader) {
// AudioSpecificConfig // AudioSpecificConfig
// 1.6.2.1 AudioSpecificConfig, in ISO_IEC_14496-3-AAC-2001.pdf, page 33. // 1.6.2.1 AudioSpecificConfig, in ISO_IEC_14496-3-AAC-2001.pdf, page 33.
acodec->aac_extra_size = stream->size() - stream->pos(); int aac_extra_size = stream->size() - stream->pos();
if (acodec->aac_extra_size > 0) { if (aac_extra_size > 0) {
srs_freepa(acodec->aac_extra_data); char *copy_stream_from = stream->data() + stream->pos();
acodec->aac_extra_data = new char[acodec->aac_extra_size]; acodec->aac_extra_data = std::vector<char>(copy_stream_from, copy_stream_from + aac_extra_size);
memcpy(acodec->aac_extra_data, stream->data() + stream->pos(), acodec->aac_extra_size);
if ((ret = audio_aac_sequence_header_demux(acodec->aac_extra_data, acodec->aac_extra_size)) != ERROR_SUCCESS) { if ((ret = audio_aac_sequence_header_demux(&acodec->aac_extra_data[0], aac_extra_size)) != ERROR_SUCCESS) {
return ret; return ret;
} }
} }

View file

@ -27,6 +27,7 @@
#include <srs_core.hpp> #include <srs_core.hpp>
#include <string> #include <string>
#include <vector>
class SrsBuffer; class SrsBuffer;
@ -548,8 +549,7 @@ public:
* without the flv codec header, * without the flv codec header,
* @see: ffmpeg, AVCodecContext::extradata * @see: ffmpeg, AVCodecContext::extradata
*/ */
int aac_extra_size; std::vector<char> aac_extra_data;
char* aac_extra_data;
public: public:
SrsAudioCodecConfig(); SrsAudioCodecConfig();
virtual ~SrsAudioCodecConfig(); virtual ~SrsAudioCodecConfig();
@ -575,8 +575,7 @@ public:
* without the flv codec header, * without the flv codec header,
* @see: ffmpeg, AVCodecContext::extradata * @see: ffmpeg, AVCodecContext::extradata
*/ */
int avc_extra_size; std::vector<char> avc_extra_data;
char* avc_extra_data;
public: public:
/** /**
* video specified * video specified
@ -587,10 +586,8 @@ public:
SrsAvcLevel avc_level; SrsAvcLevel avc_level;
// lengthSizeMinusOne, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16 // lengthSizeMinusOne, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
int8_t NAL_unit_length; int8_t NAL_unit_length;
uint16_t sequenceParameterSetLength; std::vector<char> sequenceParameterSetNALUnit;
char* sequenceParameterSetNALUnit; std::vector<char> pictureParameterSetNALUnit;
uint16_t pictureParameterSetLength;
char* pictureParameterSetNALUnit;
public: public:
// the avc payload format. // the avc payload format.
SrsAvcPayloadFormat payload_format; SrsAvcPayloadFormat payload_format;

View file

@ -3068,13 +3068,13 @@ int SrsTsMessageCache::do_cache_avc(SrsVideoFrame* frame)
// Insert sps/pps before IDR when there is no sps/pps in samples. // Insert sps/pps before IDR when there is no sps/pps in samples.
// The sps/pps is parsed from sequence header(generally the first flv packet). // The sps/pps is parsed from sequence header(generally the first flv packet).
if (nal_unit_type == SrsAvcNaluTypeIDR && !frame->has_sps_pps && !is_sps_pps_appended) { if (nal_unit_type == SrsAvcNaluTypeIDR && !frame->has_sps_pps && !is_sps_pps_appended) {
if (codec->sequenceParameterSetLength > 0) { if (!codec->sequenceParameterSetNALUnit.empty()) {
srs_avc_insert_aud(video->payload, aud_inserted); srs_avc_insert_aud(video->payload, aud_inserted);
video->payload->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength); video->payload->append(&codec->sequenceParameterSetNALUnit[0], codec->sequenceParameterSetNALUnit.size());
} }
if (codec->pictureParameterSetLength > 0) { if (!codec->pictureParameterSetNALUnit.empty()) {
srs_avc_insert_aud(video->payload, aud_inserted); srs_avc_insert_aud(video->payload, aud_inserted);
video->payload->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength); video->payload->append(&codec->pictureParameterSetNALUnit[0], codec->pictureParameterSetNALUnit.size());
} }
is_sps_pps_appended = true; is_sps_pps_appended = true;
} }