第四章 尋找合適模組機制
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 初始化條件:必須有足夠的記憶體空間來做動態記憶體配置。