From 8d32e5c6254d4a62b28a7e4f23ebaeb027a21ba2 Mon Sep 17 00:00:00 2001 From: shatty Date: Mon, 2 Feb 2004 05:45:31 +0000 Subject: [PATCH] more avcodec files git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6466 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/media/plugins/avcodec/Jamfile | 2 + src/add-ons/media/plugins/avcodec/avcodec.h | 118 +++++++++++++++ .../media/plugins/avcodec/codectbl.cpp | 139 ++++++++++++++++++ 3 files changed, 259 insertions(+) create mode 100644 src/add-ons/media/plugins/avcodec/avcodec.h create mode 100644 src/add-ons/media/plugins/avcodec/codectbl.cpp diff --git a/src/add-ons/media/plugins/avcodec/Jamfile b/src/add-ons/media/plugins/avcodec/Jamfile index 50403b66a9..6b7f132818 100644 --- a/src/add-ons/media/plugins/avcodec/Jamfile +++ b/src/add-ons/media/plugins/avcodec/Jamfile @@ -4,6 +4,8 @@ UsePrivateHeaders media ; Addon avcodec : media plugins : avcodec.cpp + codectbl.cpp + video_util.cpp : false : diff --git a/src/add-ons/media/plugins/avcodec/avcodec.h b/src/add-ons/media/plugins/avcodec/avcodec.h new file mode 100644 index 0000000000..78e5cc219c --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/avcodec.h @@ -0,0 +1,118 @@ +/****************************************************************************** +/ +/ File: avCodec.h +/ +/ Description: FFMpeg based Decoder for BeOS Release 5. +/ +/ Disclaimer: This decoder is based on undocumented APIs. +/ Therefore it is likely, if not certain, to break in future +/ versions of BeOS. This piece of software is in no way +/ connected to or even supported by Be, Inc. +/ +/ Copyright (C) 2001 François Revol. All Rights Reserved. +/ Some code from MPEG I Decoder from Carlos Hasan. +/ Had some help from Axeld +/ +******************************************************************************/ + + +#ifndef __FF_DECODER_H__ +#define __FF_DECODER_H__ + +#include +#include "ReaderPlugin.h" +#include "DecoderPlugin.h" + +//#define DO_PROFILING + +#include "video_util.h" + +struct codec_table { CodecID id; media_type type; media_format_family family; uint32 fourcc; const char *prettyname;}; + +extern const struct codec_table gCodecTable[]; +extern const int num_codecs; +extern media_format avcodec_formats[]; + +class avCodec : public Decoder +{ + public: + avCodec(); + + virtual ~avCodec(); + + virtual void GetCodecInfo(media_codec_info *mci); + + virtual status_t Setup(media_format *input_format, + const void *in_info, int32 in_size); + + virtual status_t NegotiateOutputFormat(media_format *output_format); + + virtual status_t Decode(void *out_buffer, int64 *out_frameCount, + media_header *mh, media_decode_info *info); + + virtual status_t Seek(uint32 in_towhat, + int64 in_requiredFrame, int64 *inout_frame, + bigtime_t in_requiredTime, bigtime_t *inout_time); + + + protected: + media_header fHeader; + media_decode_info fInfo; + + friend class avCodecInputStream; + + private: + media_format fInputFormat; + // media_raw_video_format fOutputFormat; + media_raw_video_format fOutputVideoFormat; + media_multi_audio_format fOutputAudioFormat; + // avCodecInputStream fStream; + // FFVideoStream fVideo; + int64 fFrame; + + bool isAudio; + + int ffcodec_index_in_table; // helps to find codecpretty + + void *fData; + size_t fOffset; + int32 fSize; + + // ffmpeg related datas + AVCodec *fCodec; + AVCodecContext /*fCodecContext,*/ *ffc; +// AVPicture ffpicture, opicture; + AVFrame *ffpicture, *opicture; + + bool fCodecInitDone; + + + gfx_convert_func conv_func; // colorspace convert func + + void * fExtraData; + int fExtraDataSize; + int fBlockAlign; + + bigtime_t fStartTime; + int32 fOutputFrameCount; + float fOutputFrameRate; + + char * fChunkBuffer; + int32 fChunkBufferOffset; + int32 fChunkBufferSize; + + char * fOutputBuffer; + int32 fOutputBufferOffset; + int32 fOutputBufferSize; + +}; + +class avCodecPlugin : public DecoderPlugin +{ +public: + Decoder * NewDecoder(uint index); + status_t GetSupportedFormats(media_format ** formats, size_t * count); +}; + + +#endif diff --git a/src/add-ons/media/plugins/avcodec/codectbl.cpp b/src/add-ons/media/plugins/avcodec/codectbl.cpp new file mode 100644 index 0000000000..36a2401a15 --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/codectbl.cpp @@ -0,0 +1,139 @@ +/****************************************************************************** +/ +/ File: codectbl.cpp +/ +/ Description: FFMpeg Generic Decoder for BeOS Release 5. +/ +/ Disclaimer: This decoder is based on undocumented APIs. +/ Therefore it is likely, if not certain, to break in future +/ versions of BeOS. This piece of software is in no way +/ connected to or even supported by Be, Inc. +/ +/ Copyright (C) 2001 François Revol. All Rights Reserved. +/ Some code from MPEG I Decoder from Carlos Hasan. +/ Had some help from Axeld +/ +******************************************************************************/ + +#include + +#include "avcodec.h" + +#define HAS_WMA_AUDIO +//#define HAS_MACE_AUDIO +//#define HAS_PHOTO_JPEG +//#define HAS_MOTION_JPEG + +#define FOURCC(a) B_SWAP_INT32(a) + +const struct codec_table gCodecTable[] = { + +/* + {CODEC_ID_PCM_MULAW, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'ulaw', "µLaw"}, + {CODEC_ID_PCM_MULAW, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x07, "µLaw"}, +*/ +#ifdef HAS_MACE_AUDIO + {CODEC_ID_MACE3, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'MAC3', "MACE 3:1"}, + {CODEC_ID_MACE6, B_MEDIA_ENCODED_AUDIO, B_QUICKTIME_FORMAT_FAMILY, 'MAC6', "MACE 6:1"}, +#endif + +#if 0 + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x50, "MPEG Audio Layer 2"}, /* mpeg audio layer 2 */ + {CODEC_ID_MP2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x55, "MPEG Audio Layer 3"}, /* mpeg audio layer 3 */ +#endif + + {CODEC_ID_AC3, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x2000, "AC3 Audio"}, /* AC3 */ + {CODEC_ID_WMAV1, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x160, "MS WMA v1"}, + {CODEC_ID_WMAV2, B_MEDIA_ENCODED_AUDIO, B_WAV_FORMAT_FAMILY, 0x161, "MS WMA v2"}, + + {CODEC_ID_H263, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('U263'), "U263"}, + {CODEC_ID_H263, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('H263'), "U263"}, +// {CODEC_ID_H263P, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('U263'), "U263"}, + {CODEC_ID_H263I, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('I263'), "Intel H263"}, /* intel h263 */ + {CODEC_ID_H263, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'h263', "H263"}, + {CODEC_ID_H263, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'H263', "H263"}, + +#ifdef HAS_PHOTO_JPEG + {CODEC_ID_MJPEG, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'JPEG', "Photo-JPEG"}, + {CODEC_ID_MJPEG, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'jpeg', "Photo-JPEG"}, /* used in BeOS_BBC.mov */ +#endif +#ifdef HAS_MOTION_JPEG + {CODEC_ID_MJPEG, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('MJPG'), "Motion JPEG"}, + {CODEC_ID_MJPEG, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'AVDJ', "Motion JPEG"}, + {CODEC_ID_MJPEG, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'mjpa', "Motion JPEG"}, + {CODEC_ID_MJPEGB, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'mjpb', "Motion JPEG"}, +#endif + + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'DIVX', "MPEG4"}, /* OpenDivX */ /* XXX: doesn't seem to work */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'divx', "MPEG4"}, /* OpenDivX */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'mp4v', "MPEG4"}, /* OpenDivX */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'XVID', "XviD (MPEG4)"}, /* OpenDivX ??? XXX: test */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('DIVX'), "MPEG4"}, /* OpenDivX */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('divx'), "MPEG4"}, /* OpenDivX */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('XVID'), "XviD (MPEG4)"}, /* XVID */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('xvid'), "XviD (MPEG4)"}, /* XVID */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('DX50'), "DivX 5 (MPEG4)"}, /* DivX 5.0 */ + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('dx50'), "DivX 5 (MPEG4)"}, /* DivX 5.0 */ + + {CODEC_ID_MPEG4, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('\004\0\0\0'), "MPEG4"}, /* some broken avi use this */ + {CODEC_ID_MSMPEG4V3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('DIV3'), "DivX ;-) (MS MPEG4 v3)"}, /* default signature when using MSMPEG4 */ + {CODEC_ID_MSMPEG4V3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('div3'), "DivX ;-) (MS MPEG4 v3)"}, + {CODEC_ID_MSMPEG4V3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('DIV4'), "DivX ;-) (MS MPEG4 v3)"}, + {CODEC_ID_MSMPEG4V3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('div4'), "DivX ;-) (MS MPEG4 v3)"}, + {CODEC_ID_MSMPEG4V1, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('MP41'), "MS MPEG4 v1"}, /* microsoft mpeg4 v1 */ + {CODEC_ID_MSMPEG4V2, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('MP42'), "MS MPEG4 v2"}, /* seems to be broken */ + {CODEC_ID_MSMPEG4V3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('MP43'), "MS MPEG4 v3"}, /* microsoft mpeg4 v3 */ + {CODEC_ID_MSMPEG4V1, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('MPG4'), "MS MPEG4"}, + {CODEC_ID_MSMPEG4V3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('AP41'), "Angel Potion (MS MPEG4 v3)"}, /* AngelPotion 1 (it's so simple to release a new codec... :^) ) */ + + {CODEC_ID_WMV1, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('WMV1'), "Microsoft WMV v1"}, + {CODEC_ID_WMV2, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, FOURCC('WMV2'), "Microsoft WMV v2"}, + +//SVQ1 + {CODEC_ID_SVQ1, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'SVQ1', "Sorenson Video v1"}, + {CODEC_ID_SVQ1, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'svq1', "Sorenson Video v1"}, + {CODEC_ID_SVQ1, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'SVQ1', "Sorenson Video v1"}, + {CODEC_ID_SVQ1, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'svq1', "Sorenson Video v1"}, + {CODEC_ID_SVQ1, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'svqi', "Sorenson Video v1"}, /* (from QT specs) */ + + {CODEC_ID_SVQ3, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'SVQ3', "Sorenson Video v3"}, + {CODEC_ID_SVQ3, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'svq3', "Sorenson Video v3"}, + +/* + {CODEC_ID_RV10, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'RV10', "RealVideo v1"}, + {CODEC_ID_RV10, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'rv10', "RealVideo v1"}, + {CODEC_ID_RV10, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'RV10', "RealVideo v1"}, + {CODEC_ID_RV10, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'rv10', "RealVideo v1"}, +*/ + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'dvsd', "DV Video"}, + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'DVSD', "DV Video"}, + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'dvhd', "DV Video"}, + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'dvsl', "DV Video"}, + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'dv25', "DV Video"}, + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'dvc ', "DV Video"}, + {CODEC_ID_DVVIDEO, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'dvcp', "DV Video"}, + + {CODEC_ID_MPEG1VIDEO, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'MPG1', "MPEG1 Video"}, + {CODEC_ID_MPEG1VIDEO, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'MPG2', "MPEG1 Video"}, + {CODEC_ID_MPEG1VIDEO, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'PIM1', "MPEG1 Video"}, + + {CODEC_ID_INDEO3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'iv31', "Indeo 3"}, + {CODEC_ID_INDEO3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'iv32', "Indeo 3"}, + {CODEC_ID_INDEO3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'IV31', "Indeo 3"}, + {CODEC_ID_INDEO3, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'IV32', "Indeo 3"}, + + {CODEC_ID_VP3, B_MEDIA_ENCODED_VIDEO, B_QUICKTIME_FORMAT_FAMILY, 'VP31', "On2 VP3"}, + + {CODEC_ID_CYUV, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'cyuv', "CYUV"}, + {CODEC_ID_CYUV, B_MEDIA_ENCODED_VIDEO, B_AVI_FORMAT_FAMILY, 'CYUV', "CYUV"}, +// quite badly handled for now... !? +// {CODEC_ID_MPEG1VIDEO, B_MEDIA_ENCODED_VIDEO, B_MPEG_FORMAT_FAMILY, B_MPEG_1_VIDEO}, + + {CODEC_ID_NONE, B_MEDIA_UNKNOWN_TYPE, B_ANY_FORMAT_FAMILY, 0, "null codec !!!"} +}; + +const int num_codecs = (sizeof(gCodecTable) / sizeof(codec_table) - 1); + + +media_format avcodec_formats[sizeof(gCodecTable)]; +