xbmc
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 <stdint.h>
12 
13 extern "C" {
14 #include <libavutil/avutil.h>
15 #include <libavformat/avformat.h>
16 #include <libavfilter/avfilter.h>
17 #include <libavcodec/avcodec.h>
18 }
19 
20 typedef struct
21 {
22  const uint8_t *data;
23  const uint8_t *end;
24  int head;
25  uint64_t cache;
27 
28 typedef struct mpeg2_sequence
29 {
30  uint32_t width;
31  uint32_t height;
32  uint32_t fps_rate;
33  uint32_t fps_scale;
34  float ratio;
35  uint32_t ratio_info;
37 
38 typedef struct
39 {
40  int profile_idc;
41  int level_idc;
42  int sps_id;
43 
44  int chroma_format_idc;
45  int separate_colour_plane_flag;
46  int bit_depth_luma_minus8;
47  int bit_depth_chroma_minus8;
48  int qpprime_y_zero_transform_bypass_flag;
49  int seq_scaling_matrix_present_flag;
50 
51  int log2_max_frame_num_minus4;
52  int pic_order_cnt_type;
53  int log2_max_pic_order_cnt_lsb_minus4;
54 
55  int max_num_ref_frames;
56  int gaps_in_frame_num_value_allowed_flag;
57  int pic_width_in_mbs_minus1;
58  int pic_height_in_map_units_minus1;
59 
60  int frame_mbs_only_flag;
61  int mb_adaptive_frame_field_flag;
62 
63  int direct_8x8_inference_flag;
64 
65  int frame_cropping_flag;
66  int frame_crop_left_offset;
67  int frame_crop_right_offset;
68  int frame_crop_top_offset;
69  int frame_crop_bottom_offset;
71 
73 {
74 public:
76  ~CBitstreamParser() = default;
77 
78  static bool Open() { return true; }
79  static void Close();
80  static bool CanStartDecode(const uint8_t *buf, int buf_size);
81 };
82 
84 {
85 public:
88 
89  bool Open(enum AVCodecID codec, uint8_t *in_extradata, int in_extrasize, bool to_annexb);
90  void Close(void);
91  bool NeedConvert(void) const { return m_convert_bitstream; }
92  bool Convert(uint8_t *pData, int iSize);
93  uint8_t* GetConvertBuffer(void) const;
94  int GetConvertSize() const;
95  uint8_t* GetExtraData(void) const;
96  int GetExtraSize() const;
97  void ResetStartDecode(void);
98  bool CanStartDecode() const;
99 
100  static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence);
101 
102 protected:
103  static int avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size);
104  static int avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size);
105  int isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len);
106  // bitstream to bytestream (Annex B) conversion support.
107  bool IsIDR(uint8_t unit_type);
108  bool IsSlice(uint8_t unit_type);
109  bool BitstreamConvertInitAVC(void *in_extradata, int in_extrasize);
110  bool BitstreamConvertInitHEVC(void *in_extradata, int in_extrasize);
111  bool BitstreamConvert(uint8_t* pData, int iSize, uint8_t **poutbuf, int *poutbuf_size);
112  static void BitstreamAllocAndCopy(uint8_t** poutbuf,
113  int* poutbuf_size,
114  const uint8_t* sps_pps,
115  uint32_t sps_pps_size,
116  const uint8_t* in,
117  uint32_t in_size,
118  uint8_t nal_type);
119 
120  typedef struct omx_bitstream_ctx {
121  uint8_t length_size;
122  uint8_t first_idr;
123  uint8_t idr_sps_pps_seen;
124  uint8_t *sps_pps_data;
125  uint32_t size;
127 
128  uint8_t *m_convertBuffer;
129  int m_convertSize;
130  uint8_t *m_inputBuffer;
131  int m_inputSize;
132 
133  uint32_t m_sps_pps_size;
134  omx_bitstream_ctx m_sps_pps_context;
135  bool m_convert_bitstream;
136  bool m_to_annexb;
137 
138  uint8_t *m_extradata;
139  int m_extrasize;
140  bool m_convert_3byteTo4byteNALSize;
141  bool m_convert_bytestream;
142  AVCodecID m_codec;
143  bool m_start_decode;
144 };
Definition: BitstreamConverter.h:28
Definition: BitstreamConverter.h:38
Definition: BitstreamConverter.h:20
Definition: BitstreamConverter.h:83
Definition: BitstreamConverter.h:72
Definition: BitstreamConverter.h:120
Definition: cache.py:1