diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp index f3a2880369..8eb21e1547 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp @@ -86,7 +86,7 @@ AVCodecDecoder::AVCodecDecoder() fFrame(0), fIsAudio(false), fCodec(NULL), - fContext(avcodec_alloc_context3(NULL)), + fCodecContext(avcodec_alloc_context3(NULL)), fResampleContext(NULL), fDecodedData(NULL), fDecodedDataSizeInBytes(0), @@ -129,9 +129,9 @@ AVCodecDecoder::AVCodecDecoder() system_info info; get_system_info(&info); - fContext->err_recognition = AV_EF_CAREFUL; - fContext->error_concealment = 3; - fContext->thread_count = info.cpu_count; + fCodecContext->err_recognition = AV_EF_CAREFUL; + fCodecContext->error_concealment = 3; + fCodecContext->thread_count = info.cpu_count; } @@ -148,7 +148,7 @@ AVCodecDecoder::~AVCodecDecoder() #endif if (fCodecInitDone) - avcodec_close(fContext); + avcodec_close(fCodecContext); swr_free(&fResampleContext); free(fChunkBuffer); @@ -158,7 +158,7 @@ AVCodecDecoder::~AVCodecDecoder() av_free(fRawDecodedPicture); av_free(fRawDecodedAudio->opaque); av_free(fRawDecodedAudio); - av_free(fContext); + av_free(fCodecContext); av_free(fDecodedDataBuffer); av_frame_free(&fFilterFrame); @@ -271,7 +271,7 @@ AVCodecDecoder::SeekedTo(int64 frame, bigtime_t time) status_t ret = B_OK; // Reset the FFmpeg codec to flush buffers, so we keep the sync if (fCodecInitDone) { - avcodec_flush_buffers(fContext); + avcodec_flush_buffers(fCodecContext); _ResetTempPacket(); } @@ -353,10 +353,10 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat) // close any previous instance if (fCodecInitDone) { fCodecInitDone = false; - avcodec_close(fContext); + avcodec_close(fCodecContext); } - if (avcodec_open2(fContext, fCodec, NULL) >= 0) + if (avcodec_open2(fCodecContext, fCodec, NULL) >= 0) fCodecInitDone = true; else { TRACE("avcodec_open() failed to init codec!\n"); @@ -381,9 +381,9 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat) media_multi_audio_format outputAudioFormat; outputAudioFormat = media_raw_audio_format::wildcard; outputAudioFormat.byte_order = B_MEDIA_HOST_ENDIAN; - outputAudioFormat.frame_rate = fContext->sample_rate; - outputAudioFormat.channel_count = fContext->channels; - ConvertAVSampleFormatToRawAudioFormat(fContext->sample_fmt, + outputAudioFormat.frame_rate = fCodecContext->sample_rate; + outputAudioFormat.channel_count = fCodecContext->channels; + ConvertAVSampleFormatToRawAudioFormat(fCodecContext->sample_fmt, outputAudioFormat.format); // Check that format is not still a wild card! if (outputAudioFormat.format == 0) { @@ -409,7 +409,7 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat) fOutputFrameSize = sampleSize * outputAudioFormat.channel_count; fOutputFrameCount = outputAudioFormat.buffer_size / fOutputFrameSize; fOutputFrameRate = outputAudioFormat.frame_rate; - if (av_sample_fmt_is_planar(fContext->sample_fmt)) + if (av_sample_fmt_is_planar(fCodecContext->sample_fmt)) fInputFrameSize = sampleSize; else fInputFrameSize = fOutputFrameSize; @@ -419,18 +419,21 @@ AVCodecDecoder::_NegotiateAudioOutputFormat(media_format* inOutFormat) if (fRawDecodedAudio->opaque == NULL) return B_NO_MEMORY; - if (av_sample_fmt_is_planar(fContext->sample_fmt)) { + if (av_sample_fmt_is_planar(fCodecContext->sample_fmt)) { fResampleContext = swr_alloc_set_opts(NULL, - fContext->channel_layout, fContext->request_sample_fmt, - fContext->sample_rate, - fContext->channel_layout, fContext->sample_fmt, fContext->sample_rate, + fCodecContext->channel_layout, + fCodecContext->request_sample_fmt, + fCodecContext->sample_rate, + fCodecContext->channel_layout, + fCodecContext->sample_fmt, + fCodecContext->sample_rate, 0, NULL); swr_init(fResampleContext); } TRACE(" bit_rate = %d, sample_rate = %d, channels = %d, " "output frame size: %d, count: %ld, rate: %.2f\n", - fContext->bit_rate, fContext->sample_rate, fContext->channels, + fCodecContext->bit_rate, fCodecContext->sample_rate, fCodecContext->channels, fOutputFrameSize, fOutputFrameCount, fOutputFrameRate); return B_OK; @@ -458,16 +461,16 @@ AVCodecDecoder::_NegotiateVideoOutputFormat(media_format* inOutFormat) if (codecCanHandleIncompleteFrames) { // Expect and handle video frames to be splitted across consecutive // data chunks. - fContext->flags |= AV_CODEC_FLAG_TRUNCATED; + fCodecContext->flags |= AV_CODEC_FLAG_TRUNCATED; } // close any previous instance if (fCodecInitDone) { fCodecInitDone = false; - avcodec_close(fContext); + avcodec_close(fCodecContext); } - if (avcodec_open2(fContext, fCodec, NULL) >= 0) + if (avcodec_open2(fCodecContext, fCodec, NULL) >= 0) fCodecInitDone = true; else { TRACE("avcodec_open() failed to init codec!\n"); @@ -746,7 +749,7 @@ AVCodecDecoder::_DecodeNextAudioFrame() } -/*! \brief Applies all essential audio input properties to fContext that were +/*! \brief Applies all essential audio input properties to fCodecContext that were passed to AVCodecDecoder when Setup() was called. Note: This function must be called before the AVCodec is opened via @@ -754,24 +757,24 @@ AVCodecDecoder::_DecodeNextAudioFrame() function avcodec_decode_audio4() is undefined. Essential properties applied from fInputFormat.u.encoded_audio: - - bit_rate copied to fContext->bit_rate - - frame_size copied to fContext->frame_size - - output.format converted to fContext->sample_fmt - - output.frame_rate copied to fContext->sample_rate - - output.channel_count copied to fContext->channels + - bit_rate copied to fCodecContext->bit_rate + - frame_size copied to fCodecContext->frame_size + - output.format converted to fCodecContext->sample_fmt + - output.frame_rate copied to fCodecContext->sample_rate + - output.channel_count copied to fCodecContext->channels Other essential properties being applied: - - fBlockAlign to fContext->block_align - - fExtraData to fContext->extradata - - fExtraDataSize to fContext->extradata_size + - fBlockAlign to fCodecContext->block_align + - fExtraData to fCodecContext->extradata + - fExtraDataSize to fCodecContext->extradata_size TODO: Either the following documentation section should be removed or this TODO when it is clear whether fInputFormat.MetaData() and - fInputFormat.MetaDataSize() have to be applied to fContext. See the related + fInputFormat.MetaDataSize() have to be applied to fCodecContext. See the related TODO in the method implementation. Only applied when fInputFormat.MetaDataSize() is greater than zero: - - fInputFormat.MetaData() to fContext->extradata - - fInputFormat.MetaDataSize() to fContext->extradata_size + - fInputFormat.MetaData() to fCodecContext->extradata + - fInputFormat.MetaDataSize() to fCodecContext->extradata_size */ void AVCodecDecoder::_ApplyEssentialAudioContainerPropertiesToContext() @@ -779,27 +782,27 @@ AVCodecDecoder::_ApplyEssentialAudioContainerPropertiesToContext() media_encoded_audio_format containerProperties = fInputFormat.u.encoded_audio; - fContext->bit_rate + fCodecContext->bit_rate = static_cast(containerProperties.bit_rate); - fContext->frame_size + fCodecContext->frame_size = static_cast(containerProperties.frame_size); ConvertRawAudioFormatToAVSampleFormat( - containerProperties.output.format, fContext->sample_fmt); + containerProperties.output.format, fCodecContext->sample_fmt); ConvertRawAudioFormatToAVSampleFormat( - containerProperties.output.format, fContext->request_sample_fmt); - fContext->sample_rate + containerProperties.output.format, fCodecContext->request_sample_fmt); + fCodecContext->sample_rate = static_cast(containerProperties.output.frame_rate); - fContext->channels + fCodecContext->channels = static_cast(containerProperties.output.channel_count); // Check that channel count is not still a wild card! - if (fContext->channels == 0) { + if (fCodecContext->channels == 0) { TRACE(" channel_count still a wild-card, assuming stereo.\n"); - fContext->channels = 2; + fCodecContext->channels = 2; } - fContext->block_align = fBlockAlign; - fContext->extradata = reinterpret_cast(fExtraData); - fContext->extradata_size = fExtraDataSize; + fCodecContext->block_align = fBlockAlign; + fCodecContext->extradata = reinterpret_cast(fExtraData); + fCodecContext->extradata_size = fExtraDataSize; // TODO: This probably needs to go away, there is some misconception // about extra data / info buffer and meta data. See @@ -808,14 +811,18 @@ AVCodecDecoder::_ApplyEssentialAudioContainerPropertiesToContext() // the infoBuffer passed to GetStreamInfo(). I think this may be why // the code below was added. if (fInputFormat.MetaDataSize() > 0) { - fContext->extradata = static_cast( + fCodecContext->extradata = static_cast( const_cast(fInputFormat.MetaData())); - fContext->extradata_size = fInputFormat.MetaDataSize(); + fCodecContext->extradata_size = fInputFormat.MetaDataSize(); } 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); + "extradata_size %d\n", + fCodecContext->bit_rate, + fCodecContext->sample_rate, + fCodecContext->channels, + fCodecContext->block_align, + fCodecContext->extradata_size); } @@ -929,7 +936,7 @@ AVCodecDecoder::_MoveAudioFramesToRawDecodedAudioAndUpdateStartTimes() // Some decoders do not support format conversion on themselves, or use // "planar" audio (each channel separated instead of interleaved samples). // In that case, we use swresample to convert the data - if (av_sample_fmt_is_planar(fContext->sample_fmt)) { + if (av_sample_fmt_is_planar(fCodecContext->sample_fmt)) { #if 0 const uint8_t* ptr[8]; for (int i = 0; i < 8; i++) { @@ -958,7 +965,7 @@ AVCodecDecoder::_MoveAudioFramesToRawDecodedAudioAndUpdateStartTimes() uintptr_t out = (uintptr_t)fRawDecodedAudio->data[0]; int32 offset = fDecodedDataBufferOffset; for (int i = 0; i < frames; i++) { - for (int j = 0; j < fContext->channels; j++) { + for (int j = 0; j < fCodecContext->channels; j++) { memcpy((void*)out, fDecodedDataBuffer->data[j] + offset, fInputFrameSize); out += fInputFrameSize; @@ -987,8 +994,8 @@ AVCodecDecoder::_MoveAudioFramesToRawDecodedAudioAndUpdateStartTimes() avformat_codec_context* codecContext = static_cast(fRawDecodedAudio->opaque); - codecContext->channels = fContext->channels; - codecContext->sample_rate = fContext->sample_rate; + codecContext->channels = fCodecContext->channels; + codecContext->sample_rate = fCodecContext->sample_rate; } fRawDecodedAudio->data[0] += decodedSize; @@ -1118,7 +1125,7 @@ AVCodecDecoder::_DecodeSomeAudioFramesIntoEmptyDecodedDataBuffer() fDecodedDataBufferOffset = 0; int gotAudioFrame = 0; - int encodedDataSizeInBytes = avcodec_decode_audio4(fContext, + int encodedDataSizeInBytes = avcodec_decode_audio4(fCodecContext, fDecodedDataBuffer, &gotAudioFrame, &fTempPacket); if (encodedDataSizeInBytes <= 0) { // Error or failure to produce decompressed output. @@ -1254,7 +1261,7 @@ AVCodecDecoder::_DecodeNextVideoFrame() // required to buffer the packets between different calls to // _DecodeNextVideoFrame(). int gotVideoFrame = 0; - int encodedDataSizeInBytes = avcodec_decode_video2(fContext, + int encodedDataSizeInBytes = avcodec_decode_video2(fCodecContext, fRawDecodedPicture, &gotVideoFrame, &fTempPacket); if (encodedDataSizeInBytes < 0) { TRACE("[v] AVCodecDecoder: ignoring error in decoding frame %lld:" @@ -1305,7 +1312,7 @@ AVCodecDecoder::_DecodeNextVideoFrame() } -/*! \brief Applies all essential video input properties to fContext that were +/*! \brief Applies all essential video input properties to fCodecContext that were passed to AVCodecDecoder when Setup() was called. Note: This function must be called before the AVCodec is opened via @@ -1313,16 +1320,16 @@ AVCodecDecoder::_DecodeNextVideoFrame() function avcodec_decode_video2() is undefined. Essential properties applied from fInputFormat.u.encoded_video.output: - - display.line_width copied to fContext->width - - display.line_count copied to fContext->height + - display.line_width copied to fCodecContext->width + - display.line_count copied to fCodecContext->height - pixel_width_aspect and pixel_height_aspect converted to - fContext->sample_aspect_ratio - - field_rate converted to fContext->time_base and - fContext->ticks_per_frame + fCodecContext->sample_aspect_ratio + - field_rate converted to fCodecContext->time_base and + fCodecContext->ticks_per_frame Other essential properties being applied: - - fExtraData to fContext->extradata - - fExtraDataSize to fContext->extradata_size + - fExtraData to fCodecContext->extradata + - fExtraDataSize to fCodecContext->extradata_size */ void AVCodecDecoder::_ApplyEssentialVideoContainerPropertiesToContext() @@ -1330,23 +1337,23 @@ AVCodecDecoder::_ApplyEssentialVideoContainerPropertiesToContext() media_raw_video_format containerProperties = fInputFormat.u.encoded_video.output; - fContext->width = containerProperties.display.line_width; - fContext->height = containerProperties.display.line_count; + fCodecContext->width = containerProperties.display.line_width; + fCodecContext->height = containerProperties.display.line_count; if (containerProperties.pixel_width_aspect > 0 && containerProperties.pixel_height_aspect > 0) { ConvertVideoAspectWidthAndHeightToAVCodecContext( containerProperties.pixel_width_aspect, - containerProperties.pixel_height_aspect, *fContext); + containerProperties.pixel_height_aspect, *fCodecContext); } if (containerProperties.field_rate > 0.0) { ConvertVideoFrameRateToAVCodecContext(containerProperties.field_rate, - *fContext); + *fCodecContext); } - fContext->extradata = reinterpret_cast(fExtraData); - fContext->extradata_size = fExtraDataSize; + fCodecContext->extradata = reinterpret_cast(fExtraData); + fCodecContext->extradata_size = fExtraDataSize; } @@ -1484,7 +1491,7 @@ AVCodecDecoder::_HandleNewVideoFrameAndUpdateSystemState() if (postProcessStatus != B_OK) return postProcessStatus; - ConvertAVCodecContextToVideoFrameRate(*fContext, fOutputFrameRate); + ConvertAVCodecContextToVideoFrameRate(*fCodecContext, fOutputFrameRate); #ifdef DEBUG dump_ffframe_video(fRawDecodedPicture, "ffpict"); @@ -1523,7 +1530,7 @@ AVCodecDecoder::_FlushOneVideoFrameFromDecoderBuffer() fTempPacket.size = 0; int gotVideoFrame = 0; - avcodec_decode_video2(fContext, fRawDecodedPicture, &gotVideoFrame, + avcodec_decode_video2(fCodecContext, fRawDecodedPicture, &gotVideoFrame, &fTempPacket); // We are only interested in complete frames now, so ignore the return // value. @@ -1578,7 +1585,7 @@ AVCodecDecoder::_UpdateMediaHeaderForVideoFrame() fHeader.u.raw_video.first_active_line = 1; fHeader.u.raw_video.line_count = fRawDecodedPicture->height; - ConvertAVCodecContextToVideoAspectWidthAndHeight(*fContext, + ConvertAVCodecContextToVideoAspectWidthAndHeight(*fCodecContext, fHeader.u.raw_video.pixel_width_aspect, fHeader.u.raw_video.pixel_height_aspect); @@ -1629,12 +1636,12 @@ AVCodecDecoder::_DeinterlaceAndColorConvertVideoFrame() rawPicture.linesize[2] = fRawDecodedPicture->linesize[2]; rawPicture.linesize[3] = fRawDecodedPicture->linesize[3]; - avpicture_alloc(&deinterlacedPicture, fContext->pix_fmt, displayWidth, + avpicture_alloc(&deinterlacedPicture, fCodecContext->pix_fmt, displayWidth, displayHeight); // deinterlace implemented using avfilter _ProcessFilterGraph(&deinterlacedPicture, &rawPicture, - fContext->pix_fmt, displayWidth, displayHeight); + fCodecContext->pix_fmt, displayWidth, displayHeight); useDeinterlacedPicture = true; } @@ -1642,14 +1649,14 @@ AVCodecDecoder::_DeinterlaceAndColorConvertVideoFrame() #if USE_SWS_FOR_COLOR_SPACE_CONVERSION if (fSwsContext == NULL) { fSwsContext = sws_getContext(displayWidth, displayHeight, - fContext->pix_fmt, displayWidth, displayHeight, + fCodecContext->pix_fmt, displayWidth, displayHeight, colorspace_to_pixfmt(fOutputColorSpace), SWS_FAST_BILINEAR, NULL, NULL, NULL); } #else if (fFormatConversionFunc == NULL) { fFormatConversionFunc = resolve_colorspace(fOutputColorSpace, - fContext->pix_fmt, displayWidth, displayHeight); + fCodecContext->pix_fmt, displayWidth, displayHeight); } #endif diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h index 4eb4e00564..43a95b3d0f 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h @@ -116,7 +116,7 @@ private: // FFmpeg related members AVCodec* fCodec; - AVCodecContext* fContext; + AVCodecContext* fCodecContext; SwrContext* fResampleContext; uint8_t* fDecodedData; size_t fDecodedDataSizeInBytes;