127f6fb6cSStephan Aßmus /* 227f6fb6cSStephan Aßmus * Copyright (C) 2001 Carlos Hasan. 327f6fb6cSStephan Aßmus * Copyright (C) 2001 François Revol. 427f6fb6cSStephan Aßmus * Copyright (C) 2001 Axel Dörfler. 527f6fb6cSStephan Aßmus * Copyright (C) 2004 Marcus Overhagen. 627f6fb6cSStephan Aßmus * Copyright (C) 2009 Stephan Aßmus <superstippi@gmx.de>. 727f6fb6cSStephan Aßmus * 827f6fb6cSStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 927f6fb6cSStephan Aßmus */ 1027f6fb6cSStephan Aßmus #ifndef AVCODEC_DECODER_H 1127f6fb6cSStephan Aßmus #define AVCODEC_DECODER_H 1227f6fb6cSStephan Aßmus 1327f6fb6cSStephan Aßmus //! libavcodec based decoder for Haiku 1427f6fb6cSStephan Aßmus 1527f6fb6cSStephan Aßmus #include <MediaFormats.h> 1627f6fb6cSStephan Aßmus 1727f6fb6cSStephan Aßmus #include "DecoderPlugin.h" 1827f6fb6cSStephan Aßmus #include "ReaderPlugin.h" 1927f6fb6cSStephan Aßmus 2027f6fb6cSStephan Aßmus #include "CodecTable.h" 2127f6fb6cSStephan Aßmus 2227f6fb6cSStephan Aßmus 2327f6fb6cSStephan Aßmus class AVCodecDecoder : public Decoder { 2427f6fb6cSStephan Aßmus public: 2527f6fb6cSStephan Aßmus AVCodecDecoder(); 2627f6fb6cSStephan Aßmus 2727f6fb6cSStephan Aßmus virtual ~AVCodecDecoder(); 2827f6fb6cSStephan Aßmus 2927f6fb6cSStephan Aßmus virtual void GetCodecInfo(media_codec_info* mci); 3027f6fb6cSStephan Aßmus 3127f6fb6cSStephan Aßmus virtual status_t Setup(media_format* ioEncodedFormat, 3227f6fb6cSStephan Aßmus const void* infoBuffer, size_t infoSize); 3327f6fb6cSStephan Aßmus 3427f6fb6cSStephan Aßmus virtual status_t NegotiateOutputFormat( 3512a9eb5dSStephan Aßmus media_format* inOutFormat); 3627f6fb6cSStephan Aßmus 3727f6fb6cSStephan Aßmus virtual status_t Decode(void* outBuffer, int64* outFrameCount, 3827f6fb6cSStephan Aßmus media_header* mediaHeader, 3927f6fb6cSStephan Aßmus media_decode_info* info); 4027f6fb6cSStephan Aßmus 4127f6fb6cSStephan Aßmus virtual status_t Seek(uint32 seekTo, int64 seekFrame, 4227f6fb6cSStephan Aßmus int64* frame, bigtime_t seekTime, 4327f6fb6cSStephan Aßmus bigtime_t* time); 4427f6fb6cSStephan Aßmus 4527f6fb6cSStephan Aßmus 4612a9eb5dSStephan Aßmus private: 4712a9eb5dSStephan Aßmus status_t _NegotiateAudioOutputFormat( 4812a9eb5dSStephan Aßmus media_format* inOutFormat); 4912a9eb5dSStephan Aßmus 5012a9eb5dSStephan Aßmus status_t _NegotiateVideoOutputFormat( 5112a9eb5dSStephan Aßmus media_format* inOutFormat); 5212a9eb5dSStephan Aßmus 5312a9eb5dSStephan Aßmus status_t _DecodeAudio(void* outBuffer, 5412a9eb5dSStephan Aßmus int64* outFrameCount, 5512a9eb5dSStephan Aßmus media_header* mediaHeader, 5612a9eb5dSStephan Aßmus media_decode_info* info); 5712a9eb5dSStephan Aßmus 5812a9eb5dSStephan Aßmus status_t _DecodeVideo(void* outBuffer, 5912a9eb5dSStephan Aßmus int64* outFrameCount, 6012a9eb5dSStephan Aßmus media_header* mediaHeader, 6112a9eb5dSStephan Aßmus media_decode_info* info); 6212a9eb5dSStephan Aßmus 6312a9eb5dSStephan Aßmus 6427f6fb6cSStephan Aßmus media_header fHeader; 6527f6fb6cSStephan Aßmus media_format fInputFormat; 6627f6fb6cSStephan Aßmus media_raw_video_format fOutputVideoFormat; 6727f6fb6cSStephan Aßmus 6827f6fb6cSStephan Aßmus int64 fFrame; 6912a9eb5dSStephan Aßmus bool fIsAudio; 7027f6fb6cSStephan Aßmus 7112a9eb5dSStephan Aßmus int fCodecIndexInTable; 7227f6fb6cSStephan Aßmus // helps to find codecpretty 7327f6fb6cSStephan Aßmus 7412a9eb5dSStephan Aßmus // FFmpeg related members 7527f6fb6cSStephan Aßmus AVCodec* fCodec; 7612a9eb5dSStephan Aßmus AVCodecContext* fContext; 7712a9eb5dSStephan Aßmus AVFrame* fInputPicture; 7812a9eb5dSStephan Aßmus AVFrame* fOutputPicture; 7927f6fb6cSStephan Aßmus 8027f6fb6cSStephan Aßmus bool fCodecInitDone; 8127f6fb6cSStephan Aßmus 8212a9eb5dSStephan Aßmus gfx_convert_func fFormatConversionFunc; 8327f6fb6cSStephan Aßmus 8427f6fb6cSStephan Aßmus char* fExtraData; 8527f6fb6cSStephan Aßmus int fExtraDataSize; 8627f6fb6cSStephan Aßmus int fBlockAlign; 8727f6fb6cSStephan Aßmus 8827f6fb6cSStephan Aßmus bigtime_t fStartTime; 8927f6fb6cSStephan Aßmus int32 fOutputFrameCount; 9027f6fb6cSStephan Aßmus float fOutputFrameRate; 9112a9eb5dSStephan Aßmus int fOutputFrameSize; 9212a9eb5dSStephan Aßmus // sample size * channel count 9327f6fb6cSStephan Aßmus 9427f6fb6cSStephan Aßmus const void* fChunkBuffer; 9527f6fb6cSStephan Aßmus int32 fChunkBufferOffset; 9627f6fb6cSStephan Aßmus size_t fChunkBufferSize; 97*967fcd2cSStephan Aßmus bool fAudioDecodeError; 9827f6fb6cSStephan Aßmus 9927f6fb6cSStephan Aßmus char* fOutputBuffer; 10027f6fb6cSStephan Aßmus int32 fOutputBufferOffset; 10127f6fb6cSStephan Aßmus int32 fOutputBufferSize; 10227f6fb6cSStephan Aßmus 10327f6fb6cSStephan Aßmus }; 10427f6fb6cSStephan Aßmus 10527f6fb6cSStephan Aßmus #endif // AVCODEC_DECODER_H 106