1 /*
2  * RAW H.264 video demuxer
3  * Copyright (c) 2008 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavcodec/get_bits.h"
23 #include "libavcodec/golomb.h"
24 #include "avformat.h"
25 #include "rawdec.h"
26 
27 #define MAX_SPS_COUNT          32
28 #define MAX_PPS_COUNT         256
29 
h264_probe(const AVProbeData *p)30 static int h264_probe(const AVProbeData *p)
31 {
32     uint32_t code = -1;
33     int sps = 0, pps = 0, idr = 0, res = 0, sli = 0;
34     int i, ret;
35     int pps_ids[MAX_PPS_COUNT+1] = {0};
36     int sps_ids[MAX_SPS_COUNT+1] = {0};
37     unsigned pps_id, sps_id;
38     GetBitContext gb;
39 
40     for (i = 0; i + 2 < p->buf_size; i++) {
41         code = (code << 8) + p->buf[i];
42         if ((code & 0xffffff00) == 0x100) {
43             int ref_idc = (code >> 5) & 3;
44             int type    = code & 0x1F;
45             static const int8_t ref_zero[] = {
46                  2,  0,  0,  0,  0, -1,  1, -1,
47                 -1,  1,  1,  1,  1, -1,  2,  2,
48                  2,  2,  2,  0,  2,  2,  2,  2,
49                  2,  2,  2,  2,  2,  2,  2,  2
50             };
51 
52             if (code & 0x80) // forbidden_bit
53                 return 0;
54 
55             if (ref_zero[type] == 1 && ref_idc)
56                 return 0;
57             if (ref_zero[type] == -1 && !ref_idc)
58                 return 0;
59             if (ref_zero[type] == 2) {
60                 if (!(code == 0x100 && !p->buf[i + 1] && !p->buf[i + 2]))
61                     res++;
62             }
63 
64             ret = init_get_bits8(&gb, p->buf + i + 1, p->buf_size - i - 1);
65             if (ret < 0)
66                 return 0;
67 
68             switch (type) {
69             case 1:
70             case 5:
71                 get_ue_golomb_long(&gb);
72                 if (get_ue_golomb_long(&gb) > 9U)
73                     return 0;
74                 pps_id = get_ue_golomb_long(&gb);
75                 if (pps_id > MAX_PPS_COUNT)
76                     return 0;
77                 if (!pps_ids[pps_id])
78                     break;
79 
80                 if (type == 1)
81                     sli++;
82                 else
83                     idr++;
84                 break;
85             case 7:
86                 skip_bits(&gb, 14);
87                 if (get_bits(&gb, 2))
88                     return 0;
89                 skip_bits(&gb, 8);
90                 sps_id = get_ue_golomb_long(&gb);
91                 if (sps_id > MAX_SPS_COUNT)
92                     return 0;
93                 sps_ids[sps_id] = 1;
94                 sps++;
95                 break;
96             case 8:
97                 pps_id = get_ue_golomb_long(&gb);
98                 if (pps_id > MAX_PPS_COUNT)
99                     return 0;
100                 sps_id = get_ue_golomb_long(&gb);
101                 if (sps_id > MAX_SPS_COUNT)
102                     return 0;
103                 if (!sps_ids[sps_id])
104                     break;
105                 pps_ids[pps_id] = 1;
106                 pps++;
107                 break;
108             }
109         }
110     }
111     ff_tlog(NULL, "sps:%d pps:%d idr:%d sli:%d res:%d\n", sps, pps, idr, sli, res);
112 
113     if (sps && pps && (idr || sli > 3) && res < (sps + pps + idr))
114         return AVPROBE_SCORE_EXTENSION + 1;  // 1 more than .mpg
115 
116     return 0;
117 }
118 
119 FF_DEF_RAWVIDEO_DEMUXER(h264, "raw H.264 video", h264_probe, "h26l,h264,264,avc", AV_CODEC_ID_H264)
120