• 沒有找到結果。

第四章 尋找合適模組機制

4.5 解碼器模組整理

以下我們將整理出這26 個 decoder modules,以及各自起始函數內的比對條件 以及初始化條件。

1. cmml decoder module(在 cmml.c 內) decoder type:

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"cmml"

比對條件:比對p_dec->fmt_in.i_codec 必須符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置

2. dmo decoder module(在 dmo.c 內) decoder type:audio/video

起始函數:static int DecoderOpen( vlc_object_t *p_this ) codec type:/* WVC1 */:"WVC1"、"wvc1"

/* WMV3 */:"WMV3"、"wmv3"

/* WMV2 */:"WMV2"、"wmv2"

/* WMV1 */:"WMV1"、"wmv1"

/* WMA 3 */:"WMA3"、"wma3"、"wmap"

/* WMA 2 */:"WMA2"、"wma2"

/* WMA Speech */:"wmas"

比對條件:比對p_dec->fmt_in.i_codec 必須符合 codec type

3. ffmpeg decoder module(在 ffmpeg.c 內) decoder type:audio/video

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:video codecs

/* MPEG-1 Video */:"mp1v"

/* MPEG-2 Video */:"mp2v"、"mpgv"

/* MPEG-4 Video */:"DTVX"、"divx"、"MP4S"、"mp4s"、

"M4S2"、"m4s2"、"xvid"、"XVID"、

"XviD"、"XVIX"、"xvix"、"DX50"、"dx50"、

"mp4v"、"MP4V"、4000、"m4cc"、"M4CC"、

"FMP4"

/* 3ivx delta 4 */:"3IV2"、"3iv2"

/* MSMPEG4 v1 */:"DIV1"、"div1"、"MPG4"、"mpg4"

/* MSMPEG4 v2 */:"DIV2"、"div2"、"MP42"、"mp42"

/* MSMPEG4 v3* /:"MPG3"、"mpg3"、"div3"、"MP43"、"mp43"

/* DivX 3.20 */:"DIV3"、"DIV4"、"div4"、"DIV5"、"div5"、

"DIV6"、"div6"

/* AngelPotion stuff */:"AP41"

/* 3ivx doctered divx files */:"3IVD"、"3ivd"

/* unknow */:"3VID"、"3vid"

/* Sorenson v1 */:"SVQ1"

/* Sorenson v3 */:"SVQ3"

/* h264 */:"h264"、"H264"、"x264"、"X264"

/* avc1: special case h264 */:"avc1"、"VSSH"、"vssh"

/* H263 */:"H263"、"h263"、"U263"、"M236"

/* H263i */:"I263"、"i263"

/* Flash (H263) variant */:"FLV1"

#if LIBAVCODEC_BUILD > 4716:"H261"

#if LIBAVCODEC_BUILD > 4680:"FLIC"

/* MJPEG */:"MJPG"、"mipg"、"mjpa"、"jpeg"、"JPEG"、

"JFIF"、"JPGL"

/* for mov file */:"mjpb"

#if LIBAVCODEC_BUILD > 4680:"SP5X"

/* DV */:"dvs1"、"dvsd"、"DVSD"、"dvhd"、"dvc "、"dvcp"、

"dvp "、"dvpp"、"CDVC"

/* Windows Media Video */:"WMV1"、"WMV2"

#if LIBAVCODEC_BUILD >= ((51<<16)+(10<<8)+1:

"WMV3"、"WCV1"

#if LIBAVCODEC_BUILD >= 4683:

/* Microsoft Video 1 */:"MSVC"、"msvc"、"CRAM"、"cram"、

"WHAM"、"wham"

/* Microsoft RLE */:"mrle"、0x1,0x0,0x0,0x0

/* Indeo Video Codecs (Quality of this decoder on ppc is not good) */

"IV31"、"iv31"、"IV32"、"iv32"

#if LIBAVCODEC_BUILD >= 4721:"tscc"

/* Huff YUV */:"HFYU"

/* Creative YUV */:"CYUV"

/* On2 VP3 Video Codecs */:"VP3 "、"VP30"、"VP31"、"vp31"

#if LIBAVCODEC_BUILD >= ((51<<16)+(14<<8)+0):

"VP5 "、"VP50"、"VP62"、"vp62"、"VP6F"

#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(27<<8)+0):

"VP60"、"VP61"

#if LIBAVCODEC_BUILD >= 4685:

/* Xiph.org theora */:"the0"

#if ( !defined( WORDS_BIGENDIAN ) ):

/* Asus Video (Another thing that doesn't work on PPC) */:

"ASV1"、"ASV2"

/* FFMPEG Video 1 (lossless codec) */:"FFV1"

/* ATI VCR1 */:"VCR1 "

/* Cirrus Logic AccuPak */:"CLJR"

/* Real Video */:"RV10"、"RV13"

#if LIBAVCODEC_BUILD >= ((51<<16)+(15<<8)+1):"RV20"

#if LIBAVCODEC_BUILD >= 4684:

/* Apple Video */:"rpza"、"smc "

/* Cinepak */:"cvid"

/* Id Quake II CIN */:"IDCI"

/* 4X Technologies */:"4xmv"

#if LIBAVCODEC_BUILD >= 4694:

/* Duck TrueMotion */:"DUCK"

/* Interplay MVE */:"imve"

/* Id RoQ */:"RoQv"

/* Sony Playstation MDEC */:"MDEC"

#if LIBAVCODEC_BUILD >= 4699:

/* Sierra VMD */:"vmdv"

#if LIBAVCODEC_BUILD >= 4719:

/* FFMPEG's SNOW wavelet codec */:"SNOW"

#if LIBAVCODEC_BUILD >= 4752:"cle "、"qdrw"、"QPEG"、

"Q1.0"、"Q1.1"、"ULTI"、

"VIXL"、"LOCO"、

"WNV1"、"AASC"

#if LIBAVCODEC_BUILD >= 4753:"IV20"、"RT21"

#if LIBAVCODEC_BUILD >= ((51<<16)+(13<<8)+0):"VMnc"

Image codecs

#if LIBAVCODEC_BUILD >= 4731:"png "、"ppm "、"pgm "、

"pgmy"、"pam "

#if LIBAVCODEC_BUILD >= ((51<<16)+(0<<8)+0):"bmp "

Audio Codecs

/* Windows Media Audio 1 */:"WMA1"、"wma1"

/* Windows Media Audio 2 */:"WMA2"、"wma2"

/* DV Audio */:"dvau"

/* MACE-3 Audio */:"MAC3"

/* MACE-6 Audio */:"MAC6"

/* RealAudio 1.0 */:"14_1"

/* RealAudio 2.0 */:"28_8"

/* MPEG Audio layer 1/2/3 */:"mpga"、"mp3 "

/* A52 Audio (aka AC3) */:"a52 "、"a52b "

#if LIBAVCODEC_BUILD >= 4719:

/* DTS Audio */:"dts "

/* AAC audio */:"mp4a"

/* 4X Technologies */:"4xma"

/* Interplay DPCM */:"idpc"

/* Id RoQ */:"RoQa"

#if LIBAVCODEC_BUILD >= 4685:

/* Sony Playstation XA ADPCM */:"xa "

/* ADX ADPCM */:"adx "

#if LIBAVCODEC_BUILD >= 4699:

/* Sierra VMD */:"vmda"

#if LIBAVCODEC_BUILD >= 4706 /* G.726 ADPCM */:"g726"

#if LIBAVCODEC_BUILD >= 4683:

/* AMR */:"samr"、"sawb"

#if LIBAVCODEC_BUILD >= 4703:

/* FLAC */:"flac"

#if LIBAVCODEC_BUILD >= 4745:

/* ALAC */:"alac"

#if LIBAVCODEC_BUILD >= ((50<<16)+(0<<8)+1):

/* QDM2 */:"QDM2"

#if LIBAVCODEC_BUILD >= ((51<<16)+(0<<8)+0):

/* COOK */:"cook"

#if LIBAVCODEC_BUILD >= ((51<<16)+(4<<8)+0):

/* TTA: The Lossless True Audio */:"TTA1"

#if LIBAVCODEC_BUILD >= ((51<<16)+(8<<8)+0):

/* Shorten */:"shn "

#if LIBAVCODEC_BUILD >= ((51<<16)+(16<<8)+0):

/* WavPack */:"WVPK"

/* PCM */:"s8 "、"u8 "、"s161"、"s16b"、"u161"、"u16b"、

"s241"、"s24b"、"u241"、"u24b"、"s321"、"s32b"、

"u321"、"u32b"、"alaw"、ulaw 比對條件:

1.比對 p_dec->fmt_in.i_codec 必須符合 codec type。

2.i_codec_id 不能等於 CODEC_ID_AAC。

初始化條件:

1.p_codec=avcodec_find_decoder( i_codec_id );p_codec 不等於 0。

2.p_context = avcodec_alloc_context();p_context 不等 0。

3.i_cat 等於 VIDEO_ES 且 i_result = E_( InitVideoDec )( p_dec, p_context, p_codec,i_codec_id, psz_namecodec ); i_result 等 於0;或 i_cat 等於 AUDIO_ES 且 i_result =

E_( InitAudioDec )( p_dec, p_context, p_codec, i_codec_id, psz_namecodec );

i_result 等於 0。

4. a52 decoder module(在 a52.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"a52 "、"a52b"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

5. adpcm decoder module(在 adpcm.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:/* IMA ADPCM */:"ima4"

/* MS ADPCM */:"ms0x000x02"

/* IMA ADPCM */:"ms0x000x11"

/* Duck DK4 ADPCM */:"ms0x000x61"

/* Duck DK3 ADPCM */:"ms0x000x62"

/* EA ADPCM */:"XAJ0"

比對條件:1.比對 p_dec->fmt_in.i_codec 是否符合 codec type 2. p_dec->fmt_in.audio.i_channels 的值為整數 1 到 5 3. p_dec->fmt_in.audio.i_rate 必須大於 0。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

6. araw decoder module(在 araw.c 內) decoder type:audio

起始函數:static int DecoderOpen( vlc_object_t *p_this )

codec type:/* from wav/avi/asf file */:"araw"、"pcm "、"aflt"

/* _signed_ big endian samples (mov)*/:"twos"

/* _signed_ little endian samples (mov)*/:"sowt"

"alaw"、"ulaw"、"mlaw"、"fl64"、"fl32"、"s32l"、"s32b"、"s24l"、

"s24b"、"s16l"、"s16b"、"s8 "、"u8 "

比對條件:1. 比對 p_dec->fmt_in.i_codec 是否符合 codec type 2. p_dec->fmt_in.audio.i_channels 的值為整數 1 到 8 3. p_dec->fmt_in.audio.i_rate 必須大於 0。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

7. cinepak decoder module(在 cinepak.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"cvid"、"CVID"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

8. cvdsub decoder module(在 cvdsub.c 內) decoder type:subtitle

起始函數:static int DecoderOpen( vlc_object_t *p_this ) codec type:"cvd "

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type

9. dts decoder module(在 dts.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"dts "、"dtsb"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

10. dvbsub decoder module(在 dvbsub.c 內) decoder type:subtitle

起始函數:static int Open( vlc_object_t *p_this ) codec type:"dvbs"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type

11. faad decoder module(在 faad.c 內)

decoder type:audio

起始函數:static int Open( vlc_object_t *p_this ) codec type:"mp4a"

比對條件:1. 比對 p_dec->fmt_in.i_codec 是否符合 codec type 2. p_sys->hfaad = faacDecOpen()不等於 NULL。

3. p_dec->fmt_in.i_extra 小於 0,或者 p_dec->fmt_in.i_extr 大於 0 但faacDecInit2( p_sys->hfaad, p_dec->fmt_in.p_extra,

p_dec->fmt_in.i_extra,&i_rate, &i_channels )要大於 0。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

12. fake decoder module(在 fake.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"fake"

比對條件:1. 比對 p_dec->fmt_in.i_codec 是否符合 codec type 2. (val.psz_string == NULL || !*val.psz_string)條件不成立 3. p_image 不等於 0。

13. flac decoder module(在 flac.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"flac"

比對條件:

1. 比對 p_dec->fmt_in.i_codec 是否符合 codec type

2. p_sys->p_flac = FLAC__stream_decoder_new();p_sys->p_flac 不等於0。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

14. libmpeg2 decoder module(在 libmpeg2.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"mpgv"、"mpg1"

/* Pinnacle hardware-mpeg1 */:"PIM1"

/* ATI Video */:"VCR2"、"mp2v"、"mpg2"、"hdv2"

比對條件:

1.比對 p_dec->fmt_in.i_codec 是否符合 codec type

2.p_sys->p_mpeg2dec = mpeg2_init();p_sys->p_mpeg2dec 不等於 0。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

15. lpcm decoder module(在 lpcm.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"lpcm"、"lpcb"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

16. mpeg_audio decoder module(在 mpeg_audio.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"mpga"

比對條件:

1.比對 p_dec->fmt_in.i_codec 是否符合 codec type

2.(p_dec->i_object_type == VLC_OBJECT_DECODER &&

!config_FindModule( p_this, "mpgatofixed32" ))條件不成立。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

17. png decoder module(在 png.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"png "、"MPNG"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

18. rawvideo decoder module(在 rawvideo.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this )

codec type:/* Planar YUV */:"I444 "、"I422 "、"I420 "、

"YV12 "、"IYUV "、"I411 "、

"I410 "、"YUV9"

/* Packed YUV */:"YUV2 "、"UYVY "

/* RGB */:"RV32"、"RV24 "、"RV16 "、"RV15 "

"yv12 "

比對條件:

1.比對 p_dec->fmt_in.i_codec 是否符合 codec type 2.(p_dec->fmt_in.video.i_width <= 0 ||

p_dec->fmt_in.video.i_height<= 0)條件不成立。

初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

19. sdl_image decoder module(在 sdl_image.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this )

codec type:"tga "、"bmp "、"pnm "、"xpm "、"xcf "、"pcx "、"gif "、"jpeg"、

"tiff"、"lbm "、"png "

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

20. speex decoder module(在 speex.c 內) decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"spx "

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

21. subsdec decoder module(在 subsdec.c 內) decoder type:subtitle

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"subt"、"ssa "

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

22. svcdsub decoder module(在 svcdsub.c 內) decoder type:subtitle

起始函數:static int DecoderOpen( vlc_object_t *p_this ) codec type:"ogt "

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type

23. telx decoder module(在 telx.c 內) decoder type:subtitle

起始函數:static int Open( vlc_object_t *p_this ) codec type:"telx"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

24. theora decoder module(在 theora.c 內) decoder type:video

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"theo"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

25. vorbis decoder module(在 vorbis.c 內)

decoder type:audio

起始函數:static int OpenDecoder( vlc_object_t *p_this ) codec type:"vorb"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

26. spudec decoder module(在 spudec.c 內) decoder type:subtitle

起始函數:static int DecoderOpen( vlc_object_t *p_this ) codec type:"spu "、"spub"

比對條件:比對p_dec->fmt_in.i_codec 是否符合 codec type 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。

相關文件