* 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:
Stephan Aßmus 2009-09-29 19:31:52 +00:00
parent bcc4e4bb37
commit ed4313bca9
1 changed files with 46 additions and 26 deletions

View File

@ -83,6 +83,11 @@ AVCodecDecoder::AVCodecDecoder()
fOutputFrameRate(1.0),
fOutputFrameSize(0),
fChunkBuffer(NULL),
fChunkBufferOffset(0),
fChunkBufferSize(0),
fAudioDecodeError(false),
fOutputBuffer(NULL),
fOutputBufferOffset(0),
fOutputBufferSize(0)
@ -147,7 +152,6 @@ AVCodecDecoder::Setup(media_format* ioEncodedFormat, const void* infoBuffer,
ioEncodedFormat->user_data_type);
TRACE("[%c] meta_data_size = %ld\n", fIsAudio?('a'):('v'),
ioEncodedFormat->MetaDataSize());
TRACE("[%c] info_size = %ld\n", fIsAudio?('a'):('v'), infoSize);
#endif
media_format_description descr;
@ -182,24 +186,27 @@ AVCodecDecoder::Setup(media_format* ioEncodedFormat, const void* infoBuffer,
puts("ERR family");
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
&& 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);
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);
return B_ERROR;
}
TRACE("AVCodecDecoder: found decoder %s\n",fCodec->name);
TRACE(" found decoder %s\n", fCodec->name);
const void* extraData = infoBuffer;
fExtraDataSize = infoSize;
if (gCodecTable[i].family == B_WAV_FORMAT_FAMILY
&& infoSize >= sizeof(wave_format_ex)) {
TRACE(" trying to use wave_format_ex\n");
// Special case extra data in B_WAV_FORMAT_FAMILY
const wave_format_ex* waveFormatData
= (const wave_format_ex*)infoBuffer;
@ -207,13 +214,19 @@ AVCodecDecoder::Setup(media_format* ioEncodedFormat, const void* infoBuffer,
size_t waveFormatSize = infoSize;
if (waveFormatData != NULL && waveFormatSize > 0) {
fBlockAlign = waveFormatData->block_align;
TRACE(" found block align: %d\n", fBlockAlign);
fExtraDataSize = waveFormatData->extra_size;
// skip the wave_format_ex from the extra data.
extraData = waveFormatData + 1;
}
} else {
fBlockAlign
= ioEncodedFormat->u.encoded_audio.output.buffer_size;
if (fIsAudio) {
fBlockAlign
= ioEncodedFormat->u.encoded_audio.output
.buffer_size;
TRACE(" using buffer_size as block align: %d\n",
fBlockAlign);
}
}
if (extraData != NULL && fExtraDataSize > 0) {
TRACE("AVCodecDecoder: extra data size %ld\n", infoSize);
@ -350,13 +363,19 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat)
fContext->block_align = fBlockAlign;
fContext->extradata = (uint8_t*)fExtraData;
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) {
fContext->extradata = (uint8_t*)fInputFormat.MetaData();
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,
fContext->channels, fContext->block_align, fContext->extradata_size);
@ -370,19 +389,22 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat)
int result = avcodec_open(fContext, fCodec);
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;
size_t sampleSize = outputAudioFormat.format
& media_raw_audio_format::B_AUDIO_SIZE_MASK;
fOutputFrameSize = sampleSize * outputAudioFormat.channel_count;
fOutputFrameCount = outputAudioFormat.buffer_size / fOutputFrameSize;
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;
fChunkBufferSize = 0;
fAudioDecodeError = false;
fOutputBufferOffset = 0;
fOutputBufferSize = 0;
@ -415,11 +437,6 @@ AVCodecDecoder::_NegotiateVideoOutputFormat(media_format* inOutFormat)
fContext->extradata = (uint8_t*)fExtraData;
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",
inOutFormat->u.raw_video.display.format);
@ -550,16 +567,19 @@ AVCodecDecoder::_DecodeAudio(void* outBuffer, int64* outFrameCount,
&out_size, (uint8_t*)fChunkBuffer + fChunkBufferOffset,
fChunkBufferSize);
if (len < 0) {
TRACE("########### audio decode error, "
"fChunkBufferSize %ld, fChunkBufferOffset %ld\n",
fChunkBufferSize, fChunkBufferOffset);
if (!fAudioDecodeError) {
TRACE("########### audio decode error, "
"fChunkBufferSize %ld, fChunkBufferOffset %ld\n",
fChunkBufferSize, fChunkBufferOffset);
fAudioDecodeError = true;
}
out_size = 0;
len = 0;
fChunkBufferOffset = 0;
fChunkBufferSize = 0;
// } else {
// TRACE("audio decode: len %d, out_size %d\n", len, out_size);
}
} else
fAudioDecodeError = false;
fChunkBufferOffset += len;
fChunkBufferSize -= len;
fOutputBufferOffset = 0;