星期四, 6月 29, 2006

ffmpeg : custom codec - dsp

ffmpeg 設計了一個完整的架構,讓你將自己implement的dsp 加入。

例如,外加的mpeg4 codec。

ffmpeg 的application 啟動的時候,要呼叫 av_register_all ( ) 建立所有support的codec的 function table。

以下是某平台的code trace...

config.mak 中多定義了 CONFIG_MY_CODEC

grep 整個source,有CONFIG_MY_CODEC的地方

libavcodec/allcodecs.c 的avcodes_register_all( ) function,可以看到,利用CONFIG_MY_CODEC來決定使用原來的ffmpeg codec還是自己的codec (heading with g):
#ifdef CONFIG_MY_CODEC
register_avcodec(&gmpeg4_encoder);
register_avcodec(&gmjpeg_encoder);
#else
register_avcodec(&mpeg4_encoder);
register_avcodec(&mjpeg_encoder);
#endif
這樣就知道codec function table name 是gmpeg4_encoder, gmjpeg_encoder。
如果整個folder執行過 ctags -R,用
$vi -t gmpeg4_encoder
這樣就可以open gmpeg4_encoder實做的source code。
AVCodec gmpeg4_encoder = {
"mpeg4",
CODEC_TYPE_VIDEO,
CODEC_ID_MPEG4,
0,
encode_init,
xvid_encode,
encode_close, /// close
NULL, /// decode
0
}
三個function : encode_init, xvid_encode, encode_close。
這樣還可以對應使用原ffmpeg mp4codec與custom codec的不同處。

AVCodec的 structure:
typedef struct AVCodec {
const char *name;
enum CodecType type;
int id;
int priv_data_size;
int (*init)(AVCodecContext *);
int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
int (*close)(AVCodecContext *);
int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,
uint8_t *buf, int buf_size);
int capabilities;
const AVOption *options;
struct AVCodec *next;
void (*flush)(AVCodecContext *);
} AVCodec;
int encode_init:

open dsp mpeg4 encoder driver dev.
將ioctl 的參數structure設定好,用ioctl(codec_fd,ENCODE_INIT,&encod_parm) 通知driver。
將AVFrame (儲存frame property and start address的結構) allocate好。
把ratecontrol parameter設好。


xvid_encode:

將傳入的YUV plane base address 取出,設定到ioctl 的arument structure。
將argument structure的bitstream (encoder的結果輸出address),

沒有留言:

網誌存檔