xref: /haiku/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.h (revision b95fa2488ad09133ca040fde61914b132680a079)
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 
17dfddb9f4SStephan Aßmus extern "C" {
18c1e73fbfSStephan Aßmus 	#include "avcodec.h"
19dfddb9f4SStephan Aßmus 	#include "swscale.h"
20dfddb9f4SStephan Aßmus }
21dfddb9f4SStephan Aßmus 
2227f6fb6cSStephan Aßmus #include "DecoderPlugin.h"
2327f6fb6cSStephan Aßmus #include "ReaderPlugin.h"
2427f6fb6cSStephan Aßmus 
2527f6fb6cSStephan Aßmus #include "CodecTable.h"
26c1e73fbfSStephan Aßmus #include "gfx_util.h"
2727f6fb6cSStephan Aßmus 
2827f6fb6cSStephan Aßmus 
2927f6fb6cSStephan Aßmus class AVCodecDecoder : public Decoder {
3027f6fb6cSStephan Aßmus public:
3127f6fb6cSStephan Aßmus 								AVCodecDecoder();
3227f6fb6cSStephan Aßmus 
3327f6fb6cSStephan Aßmus 	virtual						~AVCodecDecoder();
3427f6fb6cSStephan Aßmus 
3527f6fb6cSStephan Aßmus 	virtual	void				GetCodecInfo(media_codec_info* mci);
3627f6fb6cSStephan Aßmus 
3727f6fb6cSStephan Aßmus 	virtual	status_t			Setup(media_format* ioEncodedFormat,
3827f6fb6cSStephan Aßmus 								   const void* infoBuffer, size_t infoSize);
3927f6fb6cSStephan Aßmus 
4027f6fb6cSStephan Aßmus 	virtual	status_t			NegotiateOutputFormat(
4112a9eb5dSStephan Aßmus 									media_format* inOutFormat);
4227f6fb6cSStephan Aßmus 
4327f6fb6cSStephan Aßmus 	virtual	status_t			Decode(void* outBuffer, int64* outFrameCount,
4427f6fb6cSStephan Aßmus 									media_header* mediaHeader,
4527f6fb6cSStephan Aßmus 									media_decode_info* info);
4627f6fb6cSStephan Aßmus 
472e54e93fSStephan Aßmus 	virtual	status_t			SeekedTo(int64 trame, bigtime_t time);
4827f6fb6cSStephan Aßmus 
4927f6fb6cSStephan Aßmus 
5012a9eb5dSStephan Aßmus private:
5112a9eb5dSStephan Aßmus 			status_t			_NegotiateAudioOutputFormat(
5212a9eb5dSStephan Aßmus 									media_format* inOutFormat);
5312a9eb5dSStephan Aßmus 
5412a9eb5dSStephan Aßmus 			status_t			_NegotiateVideoOutputFormat(
5512a9eb5dSStephan Aßmus 									media_format* inOutFormat);
5612a9eb5dSStephan Aßmus 
5712a9eb5dSStephan Aßmus 			status_t			_DecodeAudio(void* outBuffer,
5812a9eb5dSStephan Aßmus 									int64* outFrameCount,
5912a9eb5dSStephan Aßmus 									media_header* mediaHeader,
6012a9eb5dSStephan Aßmus 									media_decode_info* info);
6112a9eb5dSStephan Aßmus 
6212a9eb5dSStephan Aßmus 			status_t			_DecodeVideo(void* outBuffer,
6312a9eb5dSStephan Aßmus 									int64* outFrameCount,
6412a9eb5dSStephan Aßmus 									media_header* mediaHeader,
6512a9eb5dSStephan Aßmus 									media_decode_info* info);
6612a9eb5dSStephan Aßmus 
6712a9eb5dSStephan Aßmus 
6827f6fb6cSStephan Aßmus 			media_header		fHeader;
6927f6fb6cSStephan Aßmus 			media_format		fInputFormat;
7027f6fb6cSStephan Aßmus 			media_raw_video_format fOutputVideoFormat;
7127f6fb6cSStephan Aßmus 
7227f6fb6cSStephan Aßmus 			int64				fFrame;
7312a9eb5dSStephan Aßmus 			bool				fIsAudio;
7427f6fb6cSStephan Aßmus 
7512a9eb5dSStephan Aßmus 			// FFmpeg related members
7627f6fb6cSStephan Aßmus 			AVCodec*			fCodec;
7712a9eb5dSStephan Aßmus 			AVCodecContext*		fContext;
7812a9eb5dSStephan Aßmus 			AVFrame*			fInputPicture;
7912a9eb5dSStephan Aßmus 			AVFrame*			fOutputPicture;
8027f6fb6cSStephan Aßmus 
8127f6fb6cSStephan Aßmus 			bool 				fCodecInitDone;
8227f6fb6cSStephan Aßmus 
8312a9eb5dSStephan Aßmus 			gfx_convert_func	fFormatConversionFunc;
84dfddb9f4SStephan Aßmus 			SwsContext*			fSwsContext;
8527f6fb6cSStephan Aßmus 
8627f6fb6cSStephan Aßmus 			char*				fExtraData;
8727f6fb6cSStephan Aßmus 			int					fExtraDataSize;
8827f6fb6cSStephan Aßmus 			int					fBlockAlign;
8927f6fb6cSStephan Aßmus 
9027f6fb6cSStephan Aßmus 			bigtime_t			fStartTime;
9127f6fb6cSStephan Aßmus 			int32				fOutputFrameCount;
9227f6fb6cSStephan Aßmus 			float				fOutputFrameRate;
9312a9eb5dSStephan Aßmus 			int					fOutputFrameSize;
9412a9eb5dSStephan Aßmus 									// sample size * channel count
9527f6fb6cSStephan Aßmus 
9627f6fb6cSStephan Aßmus 			const void*			fChunkBuffer;
9727f6fb6cSStephan Aßmus 			int32				fChunkBufferOffset;
9827f6fb6cSStephan Aßmus 			size_t				fChunkBufferSize;
99967fcd2cSStephan Aßmus 			bool				fAudioDecodeError;
10027f6fb6cSStephan Aßmus 
101*b95fa248SJérôme Duval 			AVFrame*			fOutputFrame;
10227f6fb6cSStephan Aßmus 			int32				fOutputBufferOffset;
10327f6fb6cSStephan Aßmus 			int32				fOutputBufferSize;
10427f6fb6cSStephan Aßmus 
105954d70d8SStephan Aßmus 			AVPacket			fTempPacket;
10627f6fb6cSStephan Aßmus };
10727f6fb6cSStephan Aßmus 
10827f6fb6cSStephan Aßmus #endif // AVCODEC_DECODER_H
109