00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "rawdec.h"
00024
00025 static int h264_probe(AVProbeData *p)
00026 {
00027 uint32_t code= -1;
00028 int sps=0, pps=0, idr=0, res=0, sli=0;
00029 int i;
00030
00031 for(i=0; i<p->buf_size; i++){
00032 code = (code<<8) + p->buf[i];
00033 if ((code & 0xffffff00) == 0x100) {
00034 int ref_idc= (code>>5)&3;
00035 int type = code & 0x1F;
00036 static const int8_t ref_zero[32]={
00037 2, 0, 0, 0, 0,-1, 1,-1,
00038 -1, 1, 1, 1, 1,-1, 2, 2,
00039 2, 2, 2, 0, 2, 2, 2, 2,
00040 2, 2, 2, 2, 2, 2, 2, 2
00041 };
00042
00043 if(code & 0x80)
00044 return 0;
00045
00046 if(ref_zero[type] == 1 && ref_idc)
00047 return 0;
00048 if(ref_zero[type] ==-1 && !ref_idc)
00049 return 0;
00050 if(ref_zero[type] == 2)
00051 res++;
00052
00053 switch(type){
00054 case 1: sli++; break;
00055 case 5: idr++; break;
00056 case 7:
00057 if(p->buf[i+2]&0x0F)
00058 return 0;
00059 sps++;
00060 break;
00061 case 8: pps++; break;
00062 }
00063 }
00064 }
00065 if(sps && pps && (idr||sli>3) && res<(sps+pps+idr))
00066 return AVPROBE_SCORE_MAX/2+1;
00067 return 0;
00068 }
00069
00070 AVInputFormat ff_h264_demuxer = {
00071 "h264",
00072 NULL_IF_CONFIG_SMALL("raw H.264 video format"),
00073 0,
00074 h264_probe,
00075 ff_raw_video_read_header,
00076 ff_raw_read_partial_packet,
00077 .flags= AVFMT_GENERIC_INDEX,
00078 .extensions = "h26l,h264,264",
00079 .value = CODEC_ID_H264,
00080 };