mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
refine hls avc/aac codec, move metadata to it.
This commit is contained in:
parent
e50968f404
commit
465ff88b1f
3 changed files with 90 additions and 45 deletions
|
@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#include <srs_kernel_log.hpp>
|
#include <srs_kernel_log.hpp>
|
||||||
#include <srs_kernel_codec.hpp>
|
#include <srs_kernel_codec.hpp>
|
||||||
#include <srs_kernel_stream.hpp>
|
#include <srs_kernel_stream.hpp>
|
||||||
|
#include <srs_protocol_amf0.hpp>
|
||||||
|
|
||||||
SrsCodecSampleUnit::SrsCodecSampleUnit()
|
SrsCodecSampleUnit::SrsCodecSampleUnit()
|
||||||
{
|
{
|
||||||
|
@ -120,6 +121,51 @@ SrsAvcAacCodec::~SrsAvcAacCodec()
|
||||||
srs_freep(pictureParameterSetNALUnit);
|
srs_freep(pictureParameterSetNALUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsAvcAacCodec::metadata_demux(SrsAmf0Object* metadata)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
srs_assert(metadata);
|
||||||
|
|
||||||
|
SrsAmf0Object* obj = metadata;
|
||||||
|
|
||||||
|
// finger out the codec info from metadata if possible.
|
||||||
|
SrsAmf0Any* prop = NULL;
|
||||||
|
|
||||||
|
if ((prop = obj->get_property("duration")) != NULL && prop->is_number()) {
|
||||||
|
duration = (int)prop->to_number();
|
||||||
|
}
|
||||||
|
if ((prop = obj->get_property("width")) != NULL && prop->is_number()) {
|
||||||
|
width = (int)prop->to_number();
|
||||||
|
}
|
||||||
|
if ((prop = obj->get_property("height")) != NULL && prop->is_number()) {
|
||||||
|
height = (int)prop->to_number();
|
||||||
|
}
|
||||||
|
if ((prop = obj->get_property("framerate")) != NULL && prop->is_number()) {
|
||||||
|
frame_rate = (int)prop->to_number();
|
||||||
|
}
|
||||||
|
if ((prop = obj->get_property("videocodecid")) != NULL && prop->is_number()) {
|
||||||
|
video_codec_id = (int)prop->to_number();
|
||||||
|
}
|
||||||
|
if ((prop = obj->get_property("videodatarate")) != NULL && prop->is_number()) {
|
||||||
|
video_data_rate = (int)(1000 * prop->to_number());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((prop = obj->get_property("audiocodecid")) != NULL && prop->is_number()) {
|
||||||
|
audio_codec_id = (int)prop->to_number();
|
||||||
|
}
|
||||||
|
if ((prop = obj->get_property("audiodatarate")) != NULL && prop->is_number()) {
|
||||||
|
audio_data_rate = (int)(1000 * prop->to_number());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ignore the following, for each flv/rtmp packet contains them:
|
||||||
|
// audiosamplerate, sample->sound_rate
|
||||||
|
// audiosamplesize, sample->sound_size
|
||||||
|
// stereo, sample->sound_type
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int SrsAvcAacCodec::audio_aac_demux(char* data, int size, SrsCodecSample* sample)
|
int SrsAvcAacCodec::audio_aac_demux(char* data, int size, SrsCodecSample* sample)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
@ -142,6 +188,7 @@ int SrsAvcAacCodec::audio_aac_demux(char* data, int size, SrsCodecSample* sample
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @see: E.4.2 Audio Tags, video_file_format_spec_v10_1.pdf, page 76
|
||||||
int8_t sound_format = stream->read_1bytes();
|
int8_t sound_format = stream->read_1bytes();
|
||||||
|
|
||||||
int8_t sound_type = sound_format & 0x01;
|
int8_t sound_type = sound_format & 0x01;
|
||||||
|
|
|
@ -33,6 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#include <srs_kernel_codec.hpp>
|
#include <srs_kernel_codec.hpp>
|
||||||
|
|
||||||
class SrsStream;
|
class SrsStream;
|
||||||
|
class SrsAmf0Object;
|
||||||
|
|
||||||
#define SRS_MAX_CODEC_SAMPLE 128
|
#define SRS_MAX_CODEC_SAMPLE 128
|
||||||
#define _SRS_AAC_SAMPLE_RATE_UNSET 15
|
#define _SRS_AAC_SAMPLE_RATE_UNSET 15
|
||||||
|
@ -223,31 +224,59 @@ public:
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* audio specified
|
* audio specified
|
||||||
|
* 1.6.2.1 AudioSpecificConfig, in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 33.
|
||||||
|
* audioObjectType, value defines in 7.1 Profiles, aac-iso-13818-7.pdf, page 40.
|
||||||
*/
|
*/
|
||||||
// 1.6.2.1 AudioSpecificConfig, in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 33.
|
|
||||||
// audioObjectType, value defines in 7.1 Profiles, aac-iso-13818-7.pdf, page 40.
|
|
||||||
u_int8_t aac_profile;
|
u_int8_t aac_profile;
|
||||||
// samplingFrequencyIndex
|
/**
|
||||||
|
* samplingFrequencyIndex
|
||||||
|
*/
|
||||||
u_int8_t aac_sample_rate;
|
u_int8_t aac_sample_rate;
|
||||||
// channelConfiguration
|
/**
|
||||||
|
* channelConfiguration
|
||||||
|
*/
|
||||||
u_int8_t aac_channels;
|
u_int8_t aac_channels;
|
||||||
public:
|
public:
|
||||||
// the avc extra data, the AVC sequence header,
|
/**
|
||||||
// without the flv codec header,
|
* the avc extra data, the AVC sequence header,
|
||||||
// @see: ffmpeg, AVCodecContext::extradata
|
* without the flv codec header,
|
||||||
|
* @see: ffmpeg, AVCodecContext::extradata
|
||||||
|
*/
|
||||||
int avc_extra_size;
|
int avc_extra_size;
|
||||||
char* avc_extra_data;
|
char* avc_extra_data;
|
||||||
// the aac extra data, the AAC sequence header,
|
/**
|
||||||
// without the flv codec header,
|
* the aac extra data, the AAC sequence header,
|
||||||
// @see: ffmpeg, AVCodecContext::extradata
|
* without the flv codec header,
|
||||||
|
* @see: ffmpeg, AVCodecContext::extradata
|
||||||
|
*/
|
||||||
int aac_extra_size;
|
int aac_extra_size;
|
||||||
char* aac_extra_data;
|
char* aac_extra_data;
|
||||||
public:
|
public:
|
||||||
SrsAvcAacCodec();
|
SrsAvcAacCodec();
|
||||||
virtual ~SrsAvcAacCodec();
|
virtual ~SrsAvcAacCodec();
|
||||||
// the following function used for hls to build the codec info.
|
// the following function used for hls to build the sample and codec.
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* demux the metadata, to to get the stream info,
|
||||||
|
* for instance, the width/height, sample rate.
|
||||||
|
* @param metadata, the metadata amf0 object. assert not NULL.
|
||||||
|
*/
|
||||||
|
virtual int metadata_demux(SrsAmf0Object* metadata);
|
||||||
|
/**
|
||||||
|
* demux the audio packet in aac codec.
|
||||||
|
* the packet mux in FLV/RTMP format defined in flv specification.
|
||||||
|
* demux the audio speicified data(sound_format, sound_size, ...) to sample.
|
||||||
|
* demux the aac specified data(aac_profile, ...) to codec from sequence header.
|
||||||
|
* demux the aac raw to sample units.
|
||||||
|
*/
|
||||||
virtual int audio_aac_demux(char* data, int size, SrsCodecSample* sample);
|
virtual int audio_aac_demux(char* data, int size, SrsCodecSample* sample);
|
||||||
|
/**
|
||||||
|
* demux the video packet in h.264 codec.
|
||||||
|
* the packet mux in FLV/RTMP format defined in flv specification.
|
||||||
|
* demux the video specified data(frame_type, codec_id, ...) to sample.
|
||||||
|
* demux the h.264 sepcified data(avc_profile, ...) to codec from sequence header.
|
||||||
|
* demux the h.264 NALUs to sampe units.
|
||||||
|
*/
|
||||||
virtual int video_avc_demux(char* data, int size, SrsCodecSample* sample);
|
virtual int video_avc_demux(char* data, int size, SrsCodecSample* sample);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1415,45 +1415,14 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsAmf0Object* obj = metadata;
|
if (metadata->count() <= 0) {
|
||||||
if (obj->count() <= 0) {
|
|
||||||
srs_trace("no metadata persent, hls ignored it.");
|
srs_trace("no metadata persent, hls ignored it.");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// finger out the codec info from metadata if possible.
|
if ((ret = codec->metadata_demux(metadata)) != ERROR_SUCCESS) {
|
||||||
SrsAmf0Any* prop = NULL;
|
return ret;
|
||||||
|
|
||||||
if ((prop = obj->get_property("duration")) != NULL && prop->is_number()) {
|
|
||||||
codec->duration = (int)prop->to_number();
|
|
||||||
}
|
}
|
||||||
if ((prop = obj->get_property("width")) != NULL && prop->is_number()) {
|
|
||||||
codec->width = (int)prop->to_number();
|
|
||||||
}
|
|
||||||
if ((prop = obj->get_property("height")) != NULL && prop->is_number()) {
|
|
||||||
codec->height = (int)prop->to_number();
|
|
||||||
}
|
|
||||||
if ((prop = obj->get_property("framerate")) != NULL && prop->is_number()) {
|
|
||||||
codec->frame_rate = (int)prop->to_number();
|
|
||||||
}
|
|
||||||
if ((prop = obj->get_property("videocodecid")) != NULL && prop->is_number()) {
|
|
||||||
codec->video_codec_id = (int)prop->to_number();
|
|
||||||
}
|
|
||||||
if ((prop = obj->get_property("videodatarate")) != NULL && prop->is_number()) {
|
|
||||||
codec->video_data_rate = (int)(1000 * prop->to_number());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((prop = obj->get_property("audiocodecid")) != NULL && prop->is_number()) {
|
|
||||||
codec->audio_codec_id = (int)prop->to_number();
|
|
||||||
}
|
|
||||||
if ((prop = obj->get_property("audiodatarate")) != NULL && prop->is_number()) {
|
|
||||||
codec->audio_data_rate = (int)(1000 * prop->to_number());
|
|
||||||
}
|
|
||||||
|
|
||||||
// ignore the following, for each flv/rtmp packet contains them:
|
|
||||||
// audiosamplerate, sample->sound_rate
|
|
||||||
// audiosamplesize, sample->sound_size
|
|
||||||
// stereo, sample->sound_type
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue