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]&0x03)
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 FF_DEF_RAWVIDEO_DEMUXER(h264 , "raw H.264 video", h264_probe, "h26l,h264,264", AV_CODEC_ID_H264)