FFmpeg
h264_parse.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 /**
20  * @file
21  * H.264 decoder/parser shared code
22  */
23 
24 #ifndef AVCODEC_H264_PARSE_H
25 #define AVCODEC_H264_PARSE_H
26 
27 #include "config.h"
28 
29 #include <stdint.h>
30 
31 #include "libavutil/attributes.h"
32 
33 #include "get_bits.h"
34 #include "h264_ps.h"
35 
36 #define MB_TYPE_REF0 MB_TYPE_ACPRED // dirty but it fits in 16 bit
37 #define MB_TYPE_8x8DCT 0x01000000
38 
39 // This table must be here because scan8[constant] must be known at compiletime
40 static const uint8_t scan8[16 * 3 + 3] = {
41  4 + 1 * 8, 5 + 1 * 8, 4 + 2 * 8, 5 + 2 * 8,
42  6 + 1 * 8, 7 + 1 * 8, 6 + 2 * 8, 7 + 2 * 8,
43  4 + 3 * 8, 5 + 3 * 8, 4 + 4 * 8, 5 + 4 * 8,
44  6 + 3 * 8, 7 + 3 * 8, 6 + 4 * 8, 7 + 4 * 8,
45  4 + 6 * 8, 5 + 6 * 8, 4 + 7 * 8, 5 + 7 * 8,
46  6 + 6 * 8, 7 + 6 * 8, 6 + 7 * 8, 7 + 7 * 8,
47  4 + 8 * 8, 5 + 8 * 8, 4 + 9 * 8, 5 + 9 * 8,
48  6 + 8 * 8, 7 + 8 * 8, 6 + 9 * 8, 7 + 9 * 8,
49  4 + 11 * 8, 5 + 11 * 8, 4 + 12 * 8, 5 + 12 * 8,
50  6 + 11 * 8, 7 + 11 * 8, 6 + 12 * 8, 7 + 12 * 8,
51  4 + 13 * 8, 5 + 13 * 8, 4 + 14 * 8, 5 + 14 * 8,
52  6 + 13 * 8, 7 + 13 * 8, 6 + 14 * 8, 7 + 14 * 8,
53  0 + 0 * 8, 0 + 5 * 8, 0 + 10 * 8
54 };
55 
56 /**
57  * Memory management control operation opcode.
58  */
59 typedef enum MMCOOpcode {
60  MMCO_END = 0,
67 } MMCOOpcode;
68 
69 typedef struct H264PredWeightTable {
74  int luma_weight_flag[2]; ///< 7.4.3.2 luma_weight_lX_flag
75  int chroma_weight_flag[2]; ///< 7.4.3.2 chroma_weight_lX_flag
76  // The following 2 can be changed to int8_t but that causes a 10 CPU cycles speed loss
77  int luma_weight[48][2][2];
78  int chroma_weight[48][2][2][2];
79  int implicit_weight[48][48][2];
81 
82 typedef struct H264POCContext {
83  int poc_lsb;
84  int poc_msb;
86  int delta_poc[2];
87  int frame_num;
88  int prev_poc_msb; ///< poc_msb of the last reference pic for POC type 0
89  int prev_poc_lsb; ///< poc_lsb of the last reference pic for POC type 0
90  int frame_num_offset; ///< for POC type 2
91  int prev_frame_num_offset; ///< for POC type 2
92  int prev_frame_num; ///< frame_num of the last pic for POC type 1/2
94 
96  const int *ref_count, int slice_type_nos,
98  int picture_structure, void *logctx);
99 
100 /**
101  * Check if the top & left blocks are available if needed & change the
102  * dc mode so it only uses the available blocks.
103  */
104 int ff_h264_check_intra4x4_pred_mode(int8_t *pred_mode_cache, void *logctx,
105  int top_samples_available, int left_samples_available);
106 
107 /**
108  * Check if the top & left blocks are available if needed & change the
109  * dc mode so it only uses the available blocks.
110  */
111 int ff_h264_check_intra_pred_mode(void *logctx, int top_samples_available,
112  int left_samples_available,
113  int mode, int is_chroma);
114 
115 int ff_h264_parse_ref_count(int *plist_count, int ref_count[2],
116  GetBitContext *gb, const PPS *pps,
117  int slice_type_nos, int picture_structure, void *logctx);
118 
119 int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc,
120  const SPS *sps, H264POCContext *poc,
121  int picture_structure, int nal_ref_idc);
122 
123 int ff_h264_decode_extradata(const uint8_t *data, int size, H264ParamSets *ps,
124  int *is_avc, int *nal_length_size,
125  int err_recognition, void *logctx);
126 
127 static av_always_inline uint32_t pack16to32(unsigned a, unsigned b)
128 {
129 #if HAVE_BIGENDIAN
130  return (b & 0xFFFF) + (a << 16);
131 #else
132  return (a & 0xFFFF) + (b << 16);
133 #endif
134 }
135 
136 #endif /* AVCODEC_H264_PARSE_H */
MMCO_LONG2UNUSED
@ MMCO_LONG2UNUSED
Definition: h264_parse.h:62
MMCO_LONG
@ MMCO_LONG
Definition: h264_parse.h:66
H264POCContext::frame_num_offset
int frame_num_offset
for POC type 2
Definition: h264_parse.h:90
H264POCContext::delta_poc_bottom
int delta_poc_bottom
Definition: h264_parse.h:85
ff_h264_init_poc
int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, const SPS *sps, H264POCContext *poc, int picture_structure, int nal_ref_idc)
Definition: h264_parse.c:279
ff_h264_pred_weight_table
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, const int *ref_count, int slice_type_nos, H264PredWeightTable *pwt, int picture_structure, void *logctx)
Definition: h264_parse.c:29
b
#define b
Definition: input.c:41
data
const char data[16]
Definition: mxf.c:148
ff_h264_parse_ref_count
int ff_h264_parse_ref_count(int *plist_count, int ref_count[2], GetBitContext *gb, const PPS *pps, int slice_type_nos, int picture_structure, void *logctx)
Definition: h264_parse.c:221
H264PredWeightTable::use_weight_chroma
int use_weight_chroma
Definition: h264_parse.h:71
MMCOOpcode
MMCOOpcode
Memory management control operation opcode.
Definition: h264_parse.h:59
H264POCContext::prev_poc_lsb
int prev_poc_lsb
poc_lsb of the last reference pic for POC type 0
Definition: h264_parse.h:89
H264POCContext::delta_poc
int delta_poc[2]
Definition: h264_parse.h:86
MMCO_SET_MAX_LONG
@ MMCO_SET_MAX_LONG
Definition: h264_parse.h:64
H264POCContext::prev_frame_num
int prev_frame_num
frame_num of the last pic for POC type 1/2
Definition: h264_parse.h:92
GetBitContext
Definition: get_bits.h:108
scan8
static const uint8_t scan8[16 *3+3]
Definition: h264_parse.h:40
H264PredWeightTable::luma_log2_weight_denom
int luma_log2_weight_denom
Definition: h264_parse.h:72
H264PredWeightTable::use_weight
int use_weight
Definition: h264_parse.h:70
pack16to32
static av_always_inline uint32_t pack16to32(unsigned a, unsigned b)
Definition: h264_parse.h:127
H264PredWeightTable::chroma_weight
int chroma_weight[48][2][2][2]
Definition: h264_parse.h:78
H264POCContext::prev_frame_num_offset
int prev_frame_num_offset
for POC type 2
Definition: h264_parse.h:91
H264PredWeightTable::chroma_log2_weight_denom
int chroma_log2_weight_denom
Definition: h264_parse.h:73
H264PredWeightTable::chroma_weight_flag
int chroma_weight_flag[2]
7.4.3.2 chroma_weight_lX_flag
Definition: h264_parse.h:75
get_bits.h
ff_h264_check_intra_pred_mode
int ff_h264_check_intra_pred_mode(void *logctx, int top_samples_available, int left_samples_available, int mode, int is_chroma)
Check if the top & left blocks are available if needed & change the dc mode so it only uses the avail...
Definition: h264_parse.c:181
H264PredWeightTable::luma_weight
int luma_weight[48][2][2]
Definition: h264_parse.h:77
SPS
Sequence parameter set.
Definition: h264_ps.h:44
PPS
Picture parameter set.
Definition: h264_ps.h:110
h264_ps.h
MMCO_END
@ MMCO_END
Definition: h264_parse.h:60
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
size
int size
Definition: twinvq_data.h:10344
ff_h264_decode_extradata
int ff_h264_decode_extradata(const uint8_t *data, int size, H264ParamSets *ps, int *is_avc, int *nal_length_size, int err_recognition, void *logctx)
Definition: h264_parse.c:464
MMCO_SHORT2UNUSED
@ MMCO_SHORT2UNUSED
Definition: h264_parse.h:61
MMCO_RESET
@ MMCO_RESET
Definition: h264_parse.h:65
H264PredWeightTable::implicit_weight
int implicit_weight[48][48][2]
Definition: h264_parse.h:79
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
attributes.h
H264POCContext::frame_num
int frame_num
Definition: h264_parse.h:87
MMCO_SHORT2LONG
@ MMCO_SHORT2LONG
Definition: h264_parse.h:63
ff_h264_check_intra4x4_pred_mode
int ff_h264_check_intra4x4_pred_mode(int8_t *pred_mode_cache, void *logctx, int top_samples_available, int left_samples_available)
Check if the top & left blocks are available if needed & change the dc mode so it only uses the avail...
Definition: h264_parse.c:133
H264POCContext
Definition: h264_parse.h:82
av_always_inline
#define av_always_inline
Definition: attributes.h:49
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
mode
mode
Definition: ebur128.h:83
H264ParamSets
Definition: h264_ps.h:144
H264PredWeightTable
Definition: h264_parse.h:69
H264POCContext::poc_lsb
int poc_lsb
Definition: h264_parse.h:83
H264POCContext::poc_msb
int poc_msb
Definition: h264_parse.h:84
H264PredWeightTable::luma_weight_flag
int luma_weight_flag[2]
7.4.3.2 luma_weight_lX_flag
Definition: h264_parse.h:74
H264POCContext::prev_poc_msb
int prev_poc_msb
poc_msb of the last reference pic for POC type 0
Definition: h264_parse.h:88