http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.33.y.git;a=summary
可以看到
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git
的內容
ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上
http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.33.y.git;a=summary
可以看到
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git
的內容
雖然 10.10 快到,但是依照慣例還是發行後一個月再 install 好了要測試的東西
static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
{
int err, i;
AVFormatContext *fmt_ctx;
fmt_ctx = avformat_alloc_context();
if ((err = av_open_input_file(&fmt_ctx, filename, iformat, 0, NULL)) < 0) {
print_error(filename, err);
return err;
}
/* fill the streams in the format context */
if ((err = av_find_stream_info(fmt_ctx)) < 0) {
print_error(filename, err);
return err;
}
dump_format(fmt_ctx, 0, filename, 0);
/* bind a decoder to each input stream */
for (i = 0; i < fmt_ctx->nb_streams; i++) {
AVStream *stream = fmt_ctx->streams[i];
AVCodec *codec;
if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) {
fprintf(stderr, "Unsupported codec (id=%d) for input stream %d\n",
stream->codec->codec_id, stream->index);
} else if (avcodec_open(stream->codec, codec) < 0) {
fprintf(stderr, "Error while opening codec for input stream %d\n",
stream->index);
}
}
*fmt_ctx_ptr = fmt_ctx;
return 0;
}
static int analyze(const uint8_t *buf, int size, int packet_size, int *index){
int stat[TS_MAX_PACKET_SIZE];
int i;
int x=0;
int best_score=0;
memset(stat, 0, packet_size*sizeof(int));
for(x=i=0; i<size-3; i++){
if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && (buf[i+3] & 0x30)){
stat[x]++;
if(stat[x] > best_score){
best_score= stat[x];
if(index) *index= x;
}
}
x++;
if(x == packet_size) x= 0;
}
return best_score;
}
逐一檢查 : score = analyze(p->buf, TS_PACKET_SIZE *check_count, TS_PACKET_SIZE , NULL)*CHECK_COUNT/check_count;
dvhs_score= analyze(p->buf, TS_DVHS_PACKET_SIZE*check_count, TS_DVHS_PACKET_SIZE, NULL)*CHECK_COUNT/check_count;
fec_score = analyze(p->buf, TS_FEC_PACKET_SIZE *check_count, TS_FEC_PACKET_SIZE , NULL)*CHECK_COUNT/check_count;
因為是 sample stream file 是 mpeg2 transport stream,而且第一個 byte 就對齊了 sync byte 0x47,所以第一個 analyz( ) 會 return 10.AVPROBE_SCORE_MAX + score - CHECK_COUNT
其中 CHECK_COUNT 就是送進去sample 的 packet number (10)。所以計算結果是 AVPROBE_SCORE_MAX。
err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
stream_open -- decode_thread -- refresh_thread | component_open -- video_thread, subtitle_thread
Audio Stream 用 callback function 實做,因為 audio stream 播放完後會 call callback function,所以從 callbackfunction 讀取 audio 的 packetqueue 資料 decode 就可以。 不必像 video, subtitle 一樣要自己"對齊"時間。
MpegTSFilter *pids[NB_PID_MAX];
struct MpegTSFilter {
int pid;
int last_cc; /* last cc code (-1 if first packet) */
enum MpegTSFilterType type;
union {
MpegTSPESFilter pes_filter;
MpegTSSectionFilter section_filter;
} u;
};
其中 union 裡的兩個 member 是 callbackfunction (跟一堆東西)。
大概就是 parse 到哪一個 pid 就那個 pid 的callback function
In file included from /home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.c:31:
/home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.h: In function ‘transpose4x4’:
/home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.h:98: error: can't find a register in class ‘GENERAL_REGS’ while reloading ‘asm’
/home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.h:98: error: ‘asm’ operand has impossible constraints
make: *** [libavcodec/x86/dsputil_mmx.o] Error 1
google 的結果說是 gcc 的問題,好像是 ebp 可不可以拿來用的問題。
但是 apply 所有 google 到的 solution 都沒有效。
所以,只好...
configure --disable-mmx --disable-mmx2 --disable-optimizations --disable-stripping
這樣就 OK 了...
很糟糕又丟臉的方法,但是主要是要 trace transport stream 的 decoding process,所以 assembly optimize 部份可以先略過...
**********************************************************************
Done. The new package has been installed and saved to
/home/charles-chang/1seg/x264/x264_1:0.20100917-1_i386.deb
You can remove it from your system anytime using:
http://www.blogger.com/img/blank.gif
dpkg -r x264
**********************************************************************
這一篇 (http://wiki.videolan.org/User:J-b#live555_.28optional.29 ) 好像說得比較清楚,可以用自己的 dependent library,在自己的 folder build,不會跟 system 混在一起。
update-alternatives --config java*
一個一個改為java5
就可以了。