AVFormatReader: Move codec to codecpar

This commit is contained in:
Barrett17
2018-08-04 12:11:08 +02:00
parent 334b8f3f9c
commit 6283eeb2ff
@@ -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;
} }