實際使用 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時,不open file。
av_probe_input_format fmt->name:mpegts
第二次呼叫才open file。
mpegts 的probe( )方式有點難 @_@...換一個好了...用chevy6.mpg 顯示
name:source : libavformat/mpeg.c
name : mpeg
mpegs_probe( )就比較清楚了
probe也就是在找...mark ...
000001BA : packet start.找一找video file是不是有這個pattern..用以前講過的xxd來作hexdump..
000001BB : system header start
000001E0 ~ 000001EF
000001C0 ~ 000001DE
000001BF : private stream 2
000001BC : program stream map
000001BD : private stream 1
000001BE : padding stream
$xxd -l 32 chevy.mpg果然,000001ba。
0000000: 0000 01ba 4400 0400 060d 00f4 c3fa ffff ....D...........
0000010: 0000 01bb 000c 807a 6106 21ff c0c0 20e0 .......za.!... .
這一篇文章(http://www.mav-magazine.com/Aug1999/MPEG/),有說明用hexeditor "編輯" MPEG檔 ....@_@
沒有留言:
張貼留言