blob: 5f3e17a0f258b14355d798db902eafdd68ef446a
1 | /* |
2 | * H.264/HEVC common parsing code |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | #ifndef AVCODEC_H2645_PARSE_H |
22 | #define AVCODEC_H2645_PARSE_H |
23 | |
24 | #include <stdint.h> |
25 | |
26 | #include "avcodec.h" |
27 | #include "get_bits.h" |
28 | |
29 | #define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes |
30 | |
31 | typedef struct H2645NAL { |
32 | uint8_t *rbsp_buffer; |
33 | int rbsp_buffer_size; |
34 | |
35 | int size; |
36 | const uint8_t *data; |
37 | |
38 | /** |
39 | * Size, in bits, of just the data, excluding the stop bit and any trailing |
40 | * padding. I.e. what HEVC calls SODB. |
41 | */ |
42 | int size_bits; |
43 | |
44 | int raw_size; |
45 | const uint8_t *raw_data; |
46 | |
47 | GetBitContext gb; |
48 | |
49 | /** |
50 | * NAL unit type |
51 | */ |
52 | int type; |
53 | |
54 | /** |
55 | * HEVC only, nuh_temporal_id_plus_1 - 1 |
56 | */ |
57 | int temporal_id; |
58 | |
59 | int skipped_bytes; |
60 | int skipped_bytes_pos_size; |
61 | int *skipped_bytes_pos; |
62 | /** |
63 | * H.264 only, nal_ref_idc |
64 | */ |
65 | int ref_idc; |
66 | } H2645NAL; |
67 | |
68 | /* an input packet split into unescaped NAL units */ |
69 | typedef struct H2645Packet { |
70 | H2645NAL *nals; |
71 | int nb_nals; |
72 | int nals_allocated; |
73 | } H2645Packet; |
74 | |
75 | /** |
76 | * Extract the raw (unescaped) bitstream. |
77 | */ |
78 | int ff_h2645_extract_rbsp(const uint8_t *src, int length, |
79 | H2645NAL *nal, int small_padding); |
80 | |
81 | /** |
82 | * Split an input packet into NAL units. |
83 | */ |
84 | int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, |
85 | void *logctx, int is_nalff, int nal_length_size, |
86 | enum AVCodecID codec_id, int small_padding); |
87 | |
88 | /** |
89 | * Free all the allocated memory in the packet. |
90 | */ |
91 | void ff_h2645_packet_uninit(H2645Packet *pkt); |
92 | |
93 | static inline int get_nalsize(int nal_length_size, const uint8_t *buf, |
94 | int buf_size, int *buf_index, void *logctx) |
95 | { |
96 | int i, nalsize = 0; |
97 | |
98 | if (*buf_index >= buf_size - nal_length_size) { |
99 | // the end of the buffer is reached, refill it |
100 | return AVERROR(EAGAIN); |
101 | } |
102 | |
103 | for (i = 0; i < nal_length_size; i++) |
104 | nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++]; |
105 | if (nalsize <= 0 || nalsize > buf_size - *buf_index) { |
106 | av_log(logctx, AV_LOG_ERROR, |
107 | "Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index); |
108 | return AVERROR_INVALIDDATA; |
109 | } |
110 | return nalsize; |
111 | } |
112 | |
113 | #endif /* AVCODEC_H2645_PARSE_H */ |
114 |