kodi
BitstreamConverter.h
1 /*
2  * Copyright (C) 2010-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "cores/FFmpeg.h"
12 
13 #include <stdint.h>
14 
15 extern "C" {
16 #include <libavutil/avutil.h>
17 #include <libavformat/avformat.h>
18 #include <libavfilter/avfilter.h>
19 #include <libavcodec/avcodec.h>
20 }
21 
22 typedef struct
23 {
24  const uint8_t *data;
25  const uint8_t *end;
26  int head;
27  uint64_t cache;
29 
30 typedef struct mpeg2_sequence
31 {
32  uint32_t width;
33  uint32_t height;
34  uint32_t fps_rate;
35  uint32_t fps_scale;
36  float ratio;
37  uint32_t ratio_info;
39 
40 typedef struct
41 {
42  int profile_idc;
43  int level_idc;
44  int sps_id;
45 
46  int chroma_format_idc;
47  int separate_colour_plane_flag;
48  int bit_depth_luma_minus8;
49  int bit_depth_chroma_minus8;
50  int qpprime_y_zero_transform_bypass_flag;
51  int seq_scaling_matrix_present_flag;
52 
53  int log2_max_frame_num_minus4;
54  int pic_order_cnt_type;
55  int log2_max_pic_order_cnt_lsb_minus4;
56 
57  int max_num_ref_frames;
58  int gaps_in_frame_num_value_allowed_flag;
59  int pic_width_in_mbs_minus1;
60  int pic_height_in_map_units_minus1;
61 
62  int frame_mbs_only_flag;
63  int mb_adaptive_frame_field_flag;
64 
65  int direct_8x8_inference_flag;
66 
67  int frame_cropping_flag;
68  int frame_crop_left_offset;
69  int frame_crop_right_offset;
70  int frame_crop_top_offset;
71  int frame_crop_bottom_offset;
73 
75 {
76 public:
78  ~CBitstreamParser() = default;
79 
80  static bool Open() { return true; }
81  static void Close();
82  static bool CanStartDecode(const uint8_t *buf, int buf_size);
83 };
84 
86 {
87 public:
90 
91  bool Open(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize, bool to_annexb);
92  void Close(void);
93  bool NeedConvert(void) const { return m_convert_bitstream; }
94  bool Convert(uint8_t *pData, int iSize);
95  uint8_t* GetConvertBuffer(void) const;
96  int GetConvertSize() const;
97  uint8_t* GetExtraData();
98  const uint8_t* GetExtraData() const;
99  int GetExtraSize() const;
100  void ResetStartDecode(void);
101  bool CanStartDecode() const;
102  void SetConvertDovi(bool value) { m_convert_dovi = value; }
103  void SetRemoveDovi(bool value) { m_removeDovi = value; }
104  void SetRemoveHdr10Plus(bool value) { m_removeHdr10Plus = value; }
105 
106  static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence);
107 
108 protected:
109  static int avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size);
110  static int avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size);
111  int isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len);
112  // bitstream to bytestream (Annex B) conversion support.
113  bool IsIDR(uint8_t unit_type);
114  bool IsSlice(uint8_t unit_type);
115  bool BitstreamConvertInitAVC(void *in_extradata, int in_extrasize);
116  bool BitstreamConvertInitHEVC(void *in_extradata, int in_extrasize);
117  bool BitstreamConvert(uint8_t* pData, int iSize, uint8_t **poutbuf, int *poutbuf_size);
118  static void BitstreamAllocAndCopy(uint8_t** poutbuf,
119  int* poutbuf_size,
120  const uint8_t* sps_pps,
121  uint32_t sps_pps_size,
122  const uint8_t* in,
123  uint32_t in_size,
124  uint8_t nal_type);
125 
126  typedef struct omx_bitstream_ctx {
127  uint8_t length_size;
128  uint8_t first_idr;
129  uint8_t idr_sps_pps_seen;
130  uint8_t *sps_pps_data;
131  uint32_t size;
133 
134  uint8_t *m_convertBuffer;
135  int m_convertSize;
136  uint8_t *m_inputBuffer;
137  int m_inputSize;
138 
139  uint32_t m_sps_pps_size;
140  omx_bitstream_ctx m_sps_pps_context;
141  bool m_convert_bitstream;
142  bool m_to_annexb;
143 
144  FFmpegExtraData m_extraData;
145  bool m_convert_3byteTo4byteNALSize;
146  bool m_convert_bytestream;
147  AVCodecID m_codec;
148  bool m_start_decode;
149  bool m_convert_dovi;
150  bool m_removeDovi;
151  bool m_removeHdr10Plus;
152 };
Definition: FFmpeg.h:75
Definition: BitstreamConverter.h:30
Definition: BitstreamConverter.h:40
Definition: BitstreamConverter.h:22
Definition: BitstreamConverter.h:85
Definition: BitstreamConverter.h:74
Definition: BitstreamConverter.h:126
Definition: cache.py:1