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:
parent
c97f2233a2
commit
98d4b6ae11
4 changed files with 38 additions and 58 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue