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();
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();
stbl->set_stts(stts);
@ -236,7 +236,7 @@ int SrsInitMp4::write(SrsFormat* format, bool video, int tid)
SrsMp4DecoderSpecificInfo* asc = new SrsMp4DecoderSpecificInfo();
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();
stbl->set_stts(stts);
@ -610,8 +610,8 @@ int SrsDashController::refresh_init_mp4(SrsSharedPtrMessage* msg, SrsFormat* for
{
int ret = ERROR_SUCCESS;
if (msg->size <= 0 || (msg->is_video() && !format->vcodec->avc_extra_size)
|| (msg->is_audio() && !format->acodec->aac_extra_size)) {
if (msg->size <= 0 || (msg->is_video() && format->vcodec->is_avc_codec_ok())
|| (msg->is_audio() && format->acodec->is_aac_codec_ok())) {
srs_warn("DASH: Ignore empty sequence header.");
return ret;
}

View file

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

View file

@ -27,6 +27,7 @@
#include <srs_core.hpp>
#include <string>
#include <vector>
class SrsBuffer;
@ -548,8 +549,7 @@ public:
* without the flv codec header,
* @see: ffmpeg, AVCodecContext::extradata
*/
int aac_extra_size;
char* aac_extra_data;
std::vector<char> aac_extra_data;
public:
SrsAudioCodecConfig();
virtual ~SrsAudioCodecConfig();
@ -575,8 +575,7 @@ public:
* without the flv codec header,
* @see: ffmpeg, AVCodecContext::extradata
*/
int avc_extra_size;
char* avc_extra_data;
std::vector<char> avc_extra_data;
public:
/**
* video specified
@ -587,10 +586,8 @@ public:
SrsAvcLevel avc_level;
// lengthSizeMinusOne, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
int8_t NAL_unit_length;
uint16_t sequenceParameterSetLength;
char* sequenceParameterSetNALUnit;
uint16_t pictureParameterSetLength;
char* pictureParameterSetNALUnit;
std::vector<char> sequenceParameterSetNALUnit;
std::vector<char> pictureParameterSetNALUnit;
public:
// the avc 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.
// 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 (codec->sequenceParameterSetLength > 0) {
if (!codec->sequenceParameterSetNALUnit.empty()) {
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);
video->payload->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength);
video->payload->append(&codec->pictureParameterSetNALUnit[0], codec->pictureParameterSetNALUnit.size());
}
is_sps_pps_appended = true;
}