* Improvements in tracing.
* Added TODO about a probable mix-up to use the media_format meta data because the FFmpeg Reader plug-in forgot to set the info-buffer correctly from GetStreamInfo(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33355 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -83,6 +83,11 @@ AVCodecDecoder::AVCodecDecoder()
|
|||||||
fOutputFrameRate(1.0),
|
fOutputFrameRate(1.0),
|
||||||
fOutputFrameSize(0),
|
fOutputFrameSize(0),
|
||||||
|
|
||||||
|
fChunkBuffer(NULL),
|
||||||
|
fChunkBufferOffset(0),
|
||||||
|
fChunkBufferSize(0),
|
||||||
|
fAudioDecodeError(false),
|
||||||
|
|
||||||
fOutputBuffer(NULL),
|
fOutputBuffer(NULL),
|
||||||
fOutputBufferOffset(0),
|
fOutputBufferOffset(0),
|
||||||
fOutputBufferSize(0)
|
fOutputBufferSize(0)
|
||||||
@@ -147,7 +152,6 @@ AVCodecDecoder::Setup(media_format* ioEncodedFormat, const void* infoBuffer,
|
|||||||
ioEncodedFormat->user_data_type);
|
ioEncodedFormat->user_data_type);
|
||||||
TRACE("[%c] meta_data_size = %ld\n", fIsAudio?('a'):('v'),
|
TRACE("[%c] meta_data_size = %ld\n", fIsAudio?('a'):('v'),
|
||||||
ioEncodedFormat->MetaDataSize());
|
ioEncodedFormat->MetaDataSize());
|
||||||
TRACE("[%c] info_size = %ld\n", fIsAudio?('a'):('v'), infoSize);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
media_format_description descr;
|
media_format_description descr;
|
||||||
@@ -182,24 +186,27 @@ AVCodecDecoder::Setup(media_format* ioEncodedFormat, const void* infoBuffer,
|
|||||||
puts("ERR family");
|
puts("ERR family");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
TRACE(" 0x%04lx codec id = \"%c%c%c%c\"\n", uint32(cid),
|
|
||||||
(char)((cid >> 24) & 0xff), (char)((cid >> 16) & 0xff),
|
|
||||||
(char)((cid >> 8) & 0xff), (char)(cid & 0xff));
|
|
||||||
|
|
||||||
if (gCodecTable[i].family == descr.family
|
if (gCodecTable[i].family == descr.family
|
||||||
&& gCodecTable[i].fourcc == cid) {
|
&& gCodecTable[i].fourcc == cid) {
|
||||||
|
|
||||||
|
TRACE(" 0x%04lx codec id = \"%c%c%c%c\"\n", uint32(cid),
|
||||||
|
(char)((cid >> 24) & 0xff), (char)((cid >> 16) & 0xff),
|
||||||
|
(char)((cid >> 8) & 0xff), (char)(cid & 0xff));
|
||||||
|
|
||||||
fCodec = avcodec_find_decoder(gCodecTable[i].id);
|
fCodec = avcodec_find_decoder(gCodecTable[i].id);
|
||||||
if (fCodec == NULL) {
|
if (fCodec == NULL) {
|
||||||
TRACE("AVCodecDecoder: unable to find the correct FFmpeg "
|
TRACE(" unable to find the correct FFmpeg "
|
||||||
"decoder (id = %d)\n", gCodecTable[i].id);
|
"decoder (id = %d)\n", gCodecTable[i].id);
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
TRACE("AVCodecDecoder: found decoder %s\n",fCodec->name);
|
TRACE(" found decoder %s\n", fCodec->name);
|
||||||
|
|
||||||
const void* extraData = infoBuffer;
|
const void* extraData = infoBuffer;
|
||||||
fExtraDataSize = infoSize;
|
fExtraDataSize = infoSize;
|
||||||
if (gCodecTable[i].family == B_WAV_FORMAT_FAMILY
|
if (gCodecTable[i].family == B_WAV_FORMAT_FAMILY
|
||||||
&& infoSize >= sizeof(wave_format_ex)) {
|
&& infoSize >= sizeof(wave_format_ex)) {
|
||||||
|
TRACE(" trying to use wave_format_ex\n");
|
||||||
// Special case extra data in B_WAV_FORMAT_FAMILY
|
// Special case extra data in B_WAV_FORMAT_FAMILY
|
||||||
const wave_format_ex* waveFormatData
|
const wave_format_ex* waveFormatData
|
||||||
= (const wave_format_ex*)infoBuffer;
|
= (const wave_format_ex*)infoBuffer;
|
||||||
@@ -207,13 +214,19 @@ AVCodecDecoder::Setup(media_format* ioEncodedFormat, const void* infoBuffer,
|
|||||||
size_t waveFormatSize = infoSize;
|
size_t waveFormatSize = infoSize;
|
||||||
if (waveFormatData != NULL && waveFormatSize > 0) {
|
if (waveFormatData != NULL && waveFormatSize > 0) {
|
||||||
fBlockAlign = waveFormatData->block_align;
|
fBlockAlign = waveFormatData->block_align;
|
||||||
|
TRACE(" found block align: %d\n", fBlockAlign);
|
||||||
fExtraDataSize = waveFormatData->extra_size;
|
fExtraDataSize = waveFormatData->extra_size;
|
||||||
// skip the wave_format_ex from the extra data.
|
// skip the wave_format_ex from the extra data.
|
||||||
extraData = waveFormatData + 1;
|
extraData = waveFormatData + 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fBlockAlign
|
if (fIsAudio) {
|
||||||
= ioEncodedFormat->u.encoded_audio.output.buffer_size;
|
fBlockAlign
|
||||||
|
= ioEncodedFormat->u.encoded_audio.output
|
||||||
|
.buffer_size;
|
||||||
|
TRACE(" using buffer_size as block align: %d\n",
|
||||||
|
fBlockAlign);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (extraData != NULL && fExtraDataSize > 0) {
|
if (extraData != NULL && fExtraDataSize > 0) {
|
||||||
TRACE("AVCodecDecoder: extra data size %ld\n", infoSize);
|
TRACE("AVCodecDecoder: extra data size %ld\n", infoSize);
|
||||||
@@ -351,12 +364,18 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat)
|
|||||||
fContext->extradata = (uint8_t*)fExtraData;
|
fContext->extradata = (uint8_t*)fExtraData;
|
||||||
fContext->extradata_size = fExtraDataSize;
|
fContext->extradata_size = fExtraDataSize;
|
||||||
|
|
||||||
|
// TODO: This probably needs to go away, there is some misconception
|
||||||
|
// about extra data / info buffer and meta data. See
|
||||||
|
// Reader::GetStreamInfo(). The AVFormatReader puts extradata and
|
||||||
|
// extradata_size into media_format::MetaData(), but used to ignore
|
||||||
|
// the infoBuffer passed to GetStreamInfo(). I think this may be why
|
||||||
|
// the code below was added.
|
||||||
if (fInputFormat.MetaDataSize() > 0) {
|
if (fInputFormat.MetaDataSize() > 0) {
|
||||||
fContext->extradata = (uint8_t*)fInputFormat.MetaData();
|
fContext->extradata = (uint8_t*)fInputFormat.MetaData();
|
||||||
fContext->extradata_size = fInputFormat.MetaDataSize();
|
fContext->extradata_size = fInputFormat.MetaDataSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("bit_rate %d, sample_rate %d, channels %d, block_align %d, "
|
TRACE(" bit_rate %d, sample_rate %d, channels %d, block_align %d, "
|
||||||
"extradata_size %d\n", fContext->bit_rate, fContext->sample_rate,
|
"extradata_size %d\n", fContext->bit_rate, fContext->sample_rate,
|
||||||
fContext->channels, fContext->block_align, fContext->extradata_size);
|
fContext->channels, fContext->block_align, fContext->extradata_size);
|
||||||
|
|
||||||
@@ -370,19 +389,22 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat)
|
|||||||
int result = avcodec_open(fContext, fCodec);
|
int result = avcodec_open(fContext, fCodec);
|
||||||
fCodecInitDone = (result >= 0);
|
fCodecInitDone = (result >= 0);
|
||||||
|
|
||||||
TRACE("audio: bit_rate = %d, sample_rate = %d, chans = %d Init = %d\n",
|
|
||||||
fContext->bit_rate, fContext->sample_rate, fContext->channels,
|
|
||||||
result);
|
|
||||||
|
|
||||||
fStartTime = 0;
|
fStartTime = 0;
|
||||||
size_t sampleSize = outputAudioFormat.format
|
size_t sampleSize = outputAudioFormat.format
|
||||||
& media_raw_audio_format::B_AUDIO_SIZE_MASK;
|
& media_raw_audio_format::B_AUDIO_SIZE_MASK;
|
||||||
fOutputFrameSize = sampleSize * outputAudioFormat.channel_count;
|
fOutputFrameSize = sampleSize * outputAudioFormat.channel_count;
|
||||||
fOutputFrameCount = outputAudioFormat.buffer_size / fOutputFrameSize;
|
fOutputFrameCount = outputAudioFormat.buffer_size / fOutputFrameSize;
|
||||||
fOutputFrameRate = outputAudioFormat.frame_rate;
|
fOutputFrameRate = outputAudioFormat.frame_rate;
|
||||||
fChunkBuffer = 0;
|
|
||||||
|
TRACE(" bit_rate = %d, sample_rate = %d, channels = %d, init = %d, "
|
||||||
|
"output frame size: %d, count: %ld, rate: %.2f\n",
|
||||||
|
fContext->bit_rate, fContext->sample_rate, fContext->channels,
|
||||||
|
result, fOutputFrameSize, fOutputFrameCount, fOutputFrameRate);
|
||||||
|
|
||||||
|
fChunkBuffer = NULL;
|
||||||
fChunkBufferOffset = 0;
|
fChunkBufferOffset = 0;
|
||||||
fChunkBufferSize = 0;
|
fChunkBufferSize = 0;
|
||||||
|
fAudioDecodeError = false;
|
||||||
fOutputBufferOffset = 0;
|
fOutputBufferOffset = 0;
|
||||||
fOutputBufferSize = 0;
|
fOutputBufferSize = 0;
|
||||||
|
|
||||||
@@ -415,11 +437,6 @@ AVCodecDecoder::_NegotiateVideoOutputFormat(media_format* inOutFormat)
|
|||||||
fContext->extradata = (uint8_t*)fExtraData;
|
fContext->extradata = (uint8_t*)fExtraData;
|
||||||
fContext->extradata_size = fExtraDataSize;
|
fContext->extradata_size = fExtraDataSize;
|
||||||
|
|
||||||
// if (fInputFormat.MetaDataSize() > 0) {
|
|
||||||
// fContext->extradata = (uint8_t*)fInputFormat.MetaData();
|
|
||||||
// fContext->extradata_size = fInputFormat.MetaDataSize();
|
|
||||||
// }
|
|
||||||
|
|
||||||
TRACE(" requested video format 0x%x\n",
|
TRACE(" requested video format 0x%x\n",
|
||||||
inOutFormat->u.raw_video.display.format);
|
inOutFormat->u.raw_video.display.format);
|
||||||
|
|
||||||
@@ -550,16 +567,19 @@ AVCodecDecoder::_DecodeAudio(void* outBuffer, int64* outFrameCount,
|
|||||||
&out_size, (uint8_t*)fChunkBuffer + fChunkBufferOffset,
|
&out_size, (uint8_t*)fChunkBuffer + fChunkBufferOffset,
|
||||||
fChunkBufferSize);
|
fChunkBufferSize);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
TRACE("########### audio decode error, "
|
if (!fAudioDecodeError) {
|
||||||
"fChunkBufferSize %ld, fChunkBufferOffset %ld\n",
|
TRACE("########### audio decode error, "
|
||||||
fChunkBufferSize, fChunkBufferOffset);
|
"fChunkBufferSize %ld, fChunkBufferOffset %ld\n",
|
||||||
|
fChunkBufferSize, fChunkBufferOffset);
|
||||||
|
fAudioDecodeError = true;
|
||||||
|
}
|
||||||
out_size = 0;
|
out_size = 0;
|
||||||
len = 0;
|
len = 0;
|
||||||
fChunkBufferOffset = 0;
|
fChunkBufferOffset = 0;
|
||||||
fChunkBufferSize = 0;
|
fChunkBufferSize = 0;
|
||||||
// } else {
|
} else
|
||||||
// TRACE("audio decode: len %d, out_size %d\n", len, out_size);
|
fAudioDecodeError = false;
|
||||||
}
|
|
||||||
fChunkBufferOffset += len;
|
fChunkBufferOffset += len;
|
||||||
fChunkBufferSize -= len;
|
fChunkBufferSize -= len;
|
||||||
fOutputBufferOffset = 0;
|
fOutputBufferOffset = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user