星期五, 6月 30, 2006

ffmpeg - read_packet

av_read_packet 從input stream中讀取一個packet
實際使用 s->iformat->read_packet( )來讀。

s在av_read_packet( ) argument中的 is, is = input_file[ist->file_index];

input_file[ ] 在 opt_input_file ( )中初始化:input_file[nb_input_files] = ic;

ic 在 av_open_input_file(&ic,filename... 初始化( 取得實體 alloc )。

av_open_input_file ( ) 中 ic->iformat = fmt = av_probe_input_format( )找到format。

av_probe_input_format( ) 依序呼叫 first_iformat list中每一個node的 read_probe( )來決定是否"認識" input stream。

first_iformat 這一個list 是由 av_register_input_foramat(AVInputFormat *)設定。

grep av_register_input_format 就可以看到 libavformat 下每個source file都有呼叫這一個function來註冊自己的 read/write function。

所以省略掉 probe 找到iformat的地方不看,s ->iformat ->read_packet ( )執行的就是libavformat下有 使用 av_register_input_format( )的source code中 read_packet 對應的function。

修改source,在 libavformat/utils.c 的av_probe_input_foramt( )最後加上
fprintf(stderr,"av_probe_input_format fmt->name:%s\n",fmt ? fmt->name : "");
看看最後是找到哪一個iformat。

make,播放 5th.m2t ,顯示 :
av_probe_input_format fmt->name:
av_probe_input_format fmt->name:mpegts
有兩次是因為第一次呼叫av_probe_input_format時,不open file。
第二次呼叫才open file。

mpegts 的probe( )方式有點難 @_@...換一個好了...用chevy6.mpg 顯示
name:
name : mpeg
source : libavformat/mpeg.c
mpegs_probe( )就比較清楚了
probe也就是在找...mark ...
000001BA   :  packet start
000001BB : system header start
000001E0 ~ 000001EF
000001C0 ~ 000001DE
000001BF : private stream 2
000001BC : program stream map
000001BD : private stream 1
000001BE : padding stream
.找一找video file是不是有這個pattern..用以前講過的xxd來作hexdump..
$xxd -l 32 chevy.mpg
0000000: 0000 01ba 4400 0400 060d 00f4 c3fa ffff ....D...........
0000010: 0000 01bb 000c 807a 6106 21ff c0c0 20e0 .......za.!... .
果然,000001ba。

這一篇文章(http://www.mav-magazine.com/Aug1999/MPEG/),有說明用hexeditor "編輯" MPEG檔 ....@_@

沒有留言:

網誌存檔