解密H264 AAC硬體解碼的關鍵擴充套件資料處理

2022-09-06 18:18:11 字數 1837 閱讀 2924

**codeccontext定義如下:

詳細解釋可以參考「iso-14496-15 **c file format文件。裡面最重要的就是nal長度和sps,pps資料和對應的長度資訊。對該資料的解析在ffmpeg裡面有現成的函式:ff_h264_decode_extradata,在我的專案裡面是自己寫的擴充套件資料解析。

typedef struct

adtscontext;

int aac_decode_extradata(adtscontext *adts, unsigned char *pbuf, int bufsize)

aot = (p[0]>>3)&0x1f;

if (aot == 31)

else

}else

else

}#ifdef aot_profile_ctrl

if (aot 

#endif

adts->objecttype = aot-1;

adts->sample_rate_index = samfreindex;

adts->channel_conf = channelconfig;

adts->write_adts = 1;

return 0;

}

上面的pbuf就是extradata。

接下來,再用adtscontext資料編碼為adts頭資訊插入每乙個aac幀前面:

int aac_set_adts_head(adtscontext *acfg, unsigned char *buf, int size)

buf[0] = 0xff;

buf[1] = 0xf1;

byte = 0;

byte |= (acfg->objecttype & 0x03) <

byte |= (acfg->sample_rate_index & 0x0f) <

byte |= (acfg->channel_conf & 0x07) >> 2;

buf[2] = byte;

byte = 0;

byte |= (acfg->channel_conf & 0x07) <

byte |= (adts_header_size + size) >> 11;

buf[3] = byte;

byte = 0;

byte |= (adts_header_size + size) >> 3;

buf[4] = byte;

byte = 0;

byte |= ((adts_header_size + size) & 0x7) <

byte |= (0x7ff >> 6) & 0x1f;

buf[5] = byte;

byte = 0;

byte |= (0x7ff & 0x3f) <

buf[6] = byte;

return 0;

}

這個頭部是固定的7位元組長度,所以可提前空出這7個位元組供adts占用。

H 264中的指數哥倫布解碼

h.264中用到的指數哥倫布解碼 標準中描述為ue v te v se v me v 時呼叫 哥倫布碼字表前幾行 碼字 編碼數字 code num 1 0 010 1 011 2 00100 3 00101 4 00110 5 00111 6 0001000 7 字首為m個0 字尾為m位的二進位制數...

CMMB中的H264和AAC打包成ts流

cmmb中的h264和aac打包成ts流 南冠彤參照tstools這個開源專案完成了cmmb的merge aac with 264 to ts.在做的過程中,分成了幾個階段。先試著將h264打包成ts,這花了最大的精力和時間 接著將aac打包成ts 最後將其合併起來。一 處理h264 1 h264 ...

symbian s60平台的H264編譯碼

windows平台和linux平台下的開源h264編解碼器很多,比如ffmepg,x264,helix等,但symbian平台上就很難看到了,一般我們都是把windows或linux的 移植到symbian上去,下面列出集中常見的使用開源的途徑 1.ffmpeg,ffmepg開源而且功能強大,而且包...