AVFormatReader: Move codec to codecpar
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2009-2010, Stephan Aßmus <[email protected]>
|
* Copyright 2009-2010, Stephan Aßmus <[email protected]>
|
||||||
* Copyright 2014, Colin Günther <[email protected]>
|
* Copyright 2014, Colin Günther <[email protected]>
|
||||||
|
* Copyright 2018, Dario Casalinuovo
|
||||||
* All rights reserved. Distributed under the terms of the GNU L-GPL license.
|
* All rights reserved. Distributed under the terms of the GNU L-GPL license.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -398,9 +399,9 @@ StreamBase::FrameRate() const
|
|||||||
{
|
{
|
||||||
// TODO: Find a way to always calculate a correct frame rate...
|
// TODO: Find a way to always calculate a correct frame rate...
|
||||||
double frameRate = 1.0;
|
double frameRate = 1.0;
|
||||||
switch (fStream->codec->codec_type) {
|
switch (fStream->codecpar->codec_type) {
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
frameRate = (double)fStream->codec->sample_rate;
|
frameRate = (double)fStream->codecpar->sample_rate;
|
||||||
break;
|
break;
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
if (fStream->avg_frame_rate.den && fStream->avg_frame_rate.num)
|
if (fStream->avg_frame_rate.den && fStream->avg_frame_rate.num)
|
||||||
@@ -409,10 +410,6 @@ StreamBase::FrameRate() const
|
|||||||
frameRate = av_q2d(fStream->r_frame_rate);
|
frameRate = av_q2d(fStream->r_frame_rate);
|
||||||
else if (fStream->time_base.den && fStream->time_base.num)
|
else if (fStream->time_base.den && fStream->time_base.num)
|
||||||
frameRate = 1 / av_q2d(fStream->time_base);
|
frameRate = 1 / av_q2d(fStream->time_base);
|
||||||
else if (fStream->codec->time_base.den
|
|
||||||
&& fStream->codec->time_base.num) {
|
|
||||||
frameRate = 1 / av_q2d(fStream->codec->time_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Fix up interlaced video for real
|
// TODO: Fix up interlaced video for real
|
||||||
if (frameRate == 50.0f)
|
if (frameRate == 50.0f)
|
||||||
@@ -962,32 +959,8 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
if (ret != B_OK)
|
if (ret != B_OK)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
// Get a pointer to the AVCodecContext for the stream at streamIndex.
|
// Get a pointer to the AVCodecPaarameters for the stream at streamIndex.
|
||||||
AVCodecContext* codecContext = fStream->codec;
|
AVCodecParameters* codecParams = fStream->codecpar;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// stippi: Here I was experimenting with the question if some fields of the
|
|
||||||
// AVCodecContext change (or get filled out at all), if the AVCodec is opened.
|
|
||||||
class CodecOpener {
|
|
||||||
public:
|
|
||||||
CodecOpener(AVCodecContext* context)
|
|
||||||
{
|
|
||||||
fCodecContext = context;
|
|
||||||
AVCodec* codec = avcodec_find_decoder(context->codec_id);
|
|
||||||
fCodecOpen = avcodec_open(context, codec) >= 0;
|
|
||||||
if (!fCodecOpen)
|
|
||||||
TRACE(" failed to open the codec!\n");
|
|
||||||
}
|
|
||||||
~CodecOpener()
|
|
||||||
{
|
|
||||||
if (fCodecOpen)
|
|
||||||
avcodec_close(fCodecContext);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
AVCodecContext* fCodecContext;
|
|
||||||
bool fCodecOpen;
|
|
||||||
} codecOpener(codecContext);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// initialize the media_format for this stream
|
// initialize the media_format for this stream
|
||||||
media_format* format = &fFormat;
|
media_format* format = &fFormat;
|
||||||
@@ -996,10 +969,10 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
media_format_description description;
|
media_format_description description;
|
||||||
|
|
||||||
// Set format family and type depending on codec_type of the stream.
|
// Set format family and type depending on codec_type of the stream.
|
||||||
switch (codecContext->codec_type) {
|
switch (codecParams->codec_type) {
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
if ((codecContext->codec_id >= AV_CODEC_ID_PCM_S16LE)
|
if ((codecParams->codec_id >= AV_CODEC_ID_PCM_S16LE)
|
||||||
&& (codecContext->codec_id <= AV_CODEC_ID_PCM_U8)) {
|
&& (codecParams->codec_id <= AV_CODEC_ID_PCM_U8)) {
|
||||||
TRACE(" raw audio\n");
|
TRACE(" raw audio\n");
|
||||||
format->type = B_MEDIA_RAW_AUDIO;
|
format->type = B_MEDIA_RAW_AUDIO;
|
||||||
description.family = B_ANY_FORMAT_FAMILY;
|
description.family = B_ANY_FORMAT_FAMILY;
|
||||||
@@ -1027,7 +1000,7 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
|
|
||||||
if (format->type == B_MEDIA_RAW_AUDIO) {
|
if (format->type == B_MEDIA_RAW_AUDIO) {
|
||||||
// We cannot describe all raw-audio formats, some are unsupported.
|
// We cannot describe all raw-audio formats, some are unsupported.
|
||||||
switch (codecContext->codec_id) {
|
switch (codecParams->codec_id) {
|
||||||
case AV_CODEC_ID_PCM_S16LE:
|
case AV_CODEC_ID_PCM_S16LE:
|
||||||
format->u.raw_audio.format
|
format->u.raw_audio.format
|
||||||
= media_raw_audio_format::B_AUDIO_SHORT;
|
= media_raw_audio_format::B_AUDIO_SHORT;
|
||||||
@@ -1068,7 +1041,7 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (description.family == B_MISC_FORMAT_FAMILY)
|
if (description.family == B_MISC_FORMAT_FAMILY)
|
||||||
description.u.misc.codec = codecContext->codec_id;
|
description.u.misc.codec = codecParams->codec_id;
|
||||||
|
|
||||||
BMediaFormats formats;
|
BMediaFormats formats;
|
||||||
status_t status = formats.GetFormatFor(description, format);
|
status_t status = formats.GetFormatFor(description, format);
|
||||||
@@ -1076,7 +1049,7 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
TRACE(" formats.GetFormatFor() error: %s\n", strerror(status));
|
TRACE(" formats.GetFormatFor() error: %s\n", strerror(status));
|
||||||
|
|
||||||
format->user_data_type = B_CODEC_TYPE_INFO;
|
format->user_data_type = B_CODEC_TYPE_INFO;
|
||||||
*(uint32*)format->user_data = codecContext->codec_tag;
|
*(uint32*)format->user_data = codecParams->codec_tag;
|
||||||
format->user_data[4] = 0;
|
format->user_data[4] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1085,10 +1058,11 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
|
|
||||||
switch (format->type) {
|
switch (format->type) {
|
||||||
case B_MEDIA_RAW_AUDIO:
|
case B_MEDIA_RAW_AUDIO:
|
||||||
format->u.raw_audio.frame_rate = (float)codecContext->sample_rate;
|
format->u.raw_audio.frame_rate = (float)codecParams->sample_rate;
|
||||||
format->u.raw_audio.channel_count = codecContext->channels;
|
format->u.raw_audio.channel_count = codecParams->channels;
|
||||||
format->u.raw_audio.channel_mask = codecContext->channel_layout;
|
format->u.raw_audio.channel_mask = codecParams->channel_layout;
|
||||||
ConvertAVSampleFormatToRawAudioFormat(codecContext->sample_fmt,
|
ConvertAVSampleFormatToRawAudioFormat(
|
||||||
|
(AVSampleFormat)codecParams->format,
|
||||||
format->u.raw_audio.format);
|
format->u.raw_audio.format);
|
||||||
format->u.raw_audio.buffer_size = 0;
|
format->u.raw_audio.buffer_size = 0;
|
||||||
|
|
||||||
@@ -1102,28 +1076,32 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case B_MEDIA_ENCODED_AUDIO:
|
case B_MEDIA_ENCODED_AUDIO:
|
||||||
format->u.encoded_audio.bit_rate = codecContext->bit_rate;
|
format->u.encoded_audio.bit_rate = codecParams->bit_rate;
|
||||||
format->u.encoded_audio.frame_size = codecContext->frame_size;
|
format->u.encoded_audio.frame_size = codecParams->frame_size;
|
||||||
// Fill in some info about possible output format
|
// Fill in some info about possible output format
|
||||||
format->u.encoded_audio.output
|
format->u.encoded_audio.output
|
||||||
= media_multi_audio_format::wildcard;
|
= media_multi_audio_format::wildcard;
|
||||||
format->u.encoded_audio.output.frame_rate
|
format->u.encoded_audio.output.frame_rate
|
||||||
= (float)codecContext->sample_rate;
|
= (float)codecParams->sample_rate;
|
||||||
// Channel layout bits match in Be API and FFmpeg.
|
// Channel layout bits match in Be API and FFmpeg.
|
||||||
format->u.encoded_audio.output.channel_count
|
format->u.encoded_audio.output.channel_count
|
||||||
= codecContext->channels;
|
= codecParams->channels;
|
||||||
format->u.encoded_audio.multi_info.channel_mask
|
format->u.encoded_audio.multi_info.channel_mask
|
||||||
= codecContext->channel_layout;
|
= codecParams->channel_layout;
|
||||||
format->u.encoded_audio.output.byte_order
|
format->u.encoded_audio.output.byte_order
|
||||||
= avformat_to_beos_byte_order(codecContext->sample_fmt);
|
= avformat_to_beos_byte_order(
|
||||||
ConvertAVSampleFormatToRawAudioFormat(codecContext->sample_fmt,
|
(AVSampleFormat)codecParams->format);
|
||||||
|
|
||||||
|
ConvertAVSampleFormatToRawAudioFormat(
|
||||||
|
(AVSampleFormat)codecParams->format,
|
||||||
format->u.encoded_audio.output.format);
|
format->u.encoded_audio.output.format);
|
||||||
if (codecContext->block_align > 0) {
|
|
||||||
|
if (codecParams->block_align > 0) {
|
||||||
format->u.encoded_audio.output.buffer_size
|
format->u.encoded_audio.output.buffer_size
|
||||||
= codecContext->block_align;
|
= codecParams->block_align;
|
||||||
} else {
|
} else {
|
||||||
format->u.encoded_audio.output.buffer_size
|
format->u.encoded_audio.output.buffer_size
|
||||||
= codecContext->frame_size * codecContext->channels
|
= codecParams->frame_size * codecParams->channels
|
||||||
* (format->u.encoded_audio.output.format
|
* (format->u.encoded_audio.output.format
|
||||||
& media_raw_audio_format::B_AUDIO_SIZE_MASK);
|
& media_raw_audio_format::B_AUDIO_SIZE_MASK);
|
||||||
}
|
}
|
||||||
@@ -1132,9 +1110,9 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
case B_MEDIA_ENCODED_VIDEO:
|
case B_MEDIA_ENCODED_VIDEO:
|
||||||
// TODO: Specifying any of these seems to throw off the format matching
|
// TODO: Specifying any of these seems to throw off the format matching
|
||||||
// later on.
|
// later on.
|
||||||
// format->u.encoded_video.avg_bit_rate = codecContext->bit_rate;
|
// format->u.encoded_video.avg_bit_rate = codecParams->bit_rate;
|
||||||
// format->u.encoded_video.max_bit_rate = codecContext->bit_rate
|
// format->u.encoded_video.max_bit_rate = codecParams->bit_rate
|
||||||
// + codecContext->bit_rate_tolerance;
|
// + codecParams->bit_rate_tolerance;
|
||||||
|
|
||||||
// format->u.encoded_video.encoding
|
// format->u.encoded_video.encoding
|
||||||
// = media_encoded_video_format::B_ANY;
|
// = media_encoded_video_format::B_ANY;
|
||||||
@@ -1148,24 +1126,24 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
|
|
||||||
format->u.encoded_video.output.first_active = 0;
|
format->u.encoded_video.output.first_active = 0;
|
||||||
format->u.encoded_video.output.last_active
|
format->u.encoded_video.output.last_active
|
||||||
= codecContext->height - 1;
|
= codecParams->height - 1;
|
||||||
// TODO: Maybe libavformat actually provides that info
|
// TODO: Maybe libavformat actually provides that info
|
||||||
// somewhere...
|
// somewhere...
|
||||||
format->u.encoded_video.output.orientation
|
format->u.encoded_video.output.orientation
|
||||||
= B_VIDEO_TOP_LEFT_RIGHT;
|
= B_VIDEO_TOP_LEFT_RIGHT;
|
||||||
|
|
||||||
ConvertAVCodecContextToVideoAspectWidthAndHeight(*codecContext,
|
ConvertAVCodecParametersToVideoAspectWidthAndHeight(*codecParams,
|
||||||
format->u.encoded_video.output.pixel_width_aspect,
|
format->u.encoded_video.output.pixel_width_aspect,
|
||||||
format->u.encoded_video.output.pixel_height_aspect);
|
format->u.encoded_video.output.pixel_height_aspect);
|
||||||
|
|
||||||
format->u.encoded_video.output.display.format
|
format->u.encoded_video.output.display.format
|
||||||
= pixfmt_to_colorspace(codecContext->pix_fmt);
|
= pixfmt_to_colorspace(codecParams->format);
|
||||||
format->u.encoded_video.output.display.line_width
|
format->u.encoded_video.output.display.line_width
|
||||||
= codecContext->width;
|
= codecParams->width;
|
||||||
format->u.encoded_video.output.display.line_count
|
format->u.encoded_video.output.display.line_count
|
||||||
= codecContext->height;
|
= codecParams->height;
|
||||||
TRACE(" width/height: %d/%d\n", codecContext->width,
|
TRACE(" width/height: %d/%d\n", codecParams->width,
|
||||||
codecContext->height);
|
codecParams->height);
|
||||||
format->u.encoded_video.output.display.bytes_per_row = 0;
|
format->u.encoded_video.output.display.bytes_per_row = 0;
|
||||||
format->u.encoded_video.output.display.pixel_offset = 0;
|
format->u.encoded_video.output.display.pixel_offset = 0;
|
||||||
format->u.encoded_video.output.display.line_offset = 0;
|
format->u.encoded_video.output.display.line_offset = 0;
|
||||||
@@ -1179,17 +1157,17 @@ AVFormatReader::Stream::Init(int32 virtualIndex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the meta data, if any
|
// Add the meta data, if any
|
||||||
if (codecContext->extradata_size > 0) {
|
if (codecParams->extradata_size > 0) {
|
||||||
format->SetMetaData(codecContext->extradata,
|
format->SetMetaData(codecParams->extradata,
|
||||||
codecContext->extradata_size);
|
codecParams->extradata_size);
|
||||||
TRACE(" extradata: %p\n", format->MetaData());
|
TRACE(" extradata: %p\n", format->MetaData());
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(" extradata_size: %d\n", codecContext->extradata_size);
|
TRACE(" extradata_size: %d\n", codecParams->extradata_size);
|
||||||
// TRACE(" intra_matrix: %p\n", codecContext->intra_matrix);
|
// TRACE(" intra_matrix: %p\n", codecParams->intra_matrix);
|
||||||
// TRACE(" inter_matrix: %p\n", codecContext->inter_matrix);
|
// TRACE(" inter_matrix: %p\n", codecParams->inter_matrix);
|
||||||
// TRACE(" get_buffer(): %p\n", codecContext->get_buffer);
|
// TRACE(" get_buffer(): %p\n", codecParams->get_buffer);
|
||||||
// TRACE(" release_buffer(): %p\n", codecContext->release_buffer);
|
// TRACE(" release_buffer(): %p\n", codecParams->release_buffer);
|
||||||
|
|
||||||
#ifdef TRACE_AVFORMAT_READER
|
#ifdef TRACE_AVFORMAT_READER
|
||||||
char formatString[512];
|
char formatString[512];
|
||||||
@@ -1268,7 +1246,7 @@ AVFormatReader::Stream::GetStreamInfo(int64* frameCount,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*frameCount = fStream->nb_frames * fStream->codec->frame_size;
|
*frameCount = fStream->nb_frames * fStream->codecpar->frame_size;
|
||||||
if (*frameCount == 0) {
|
if (*frameCount == 0) {
|
||||||
// Calculate from duration and frame rate
|
// Calculate from duration and frame rate
|
||||||
*frameCount = (int64)(*duration * frameRate / 1000000LL);
|
*frameCount = (int64)(*duration * frameRate / 1000000LL);
|
||||||
@@ -1279,8 +1257,8 @@ AVFormatReader::Stream::GetStreamInfo(int64* frameCount,
|
|||||||
|
|
||||||
*format = fFormat;
|
*format = fFormat;
|
||||||
|
|
||||||
*infoBuffer = fStream->codec->extradata;
|
*infoBuffer = fStream->codecpar->extradata;
|
||||||
*infoSize = fStream->codec->extradata_size;
|
*infoSize = fStream->codecpar->extradata_size;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user