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