Merge pull request #26220 from 78andyp/blurayfixes
[xbmc.git] / xbmc / utils / BitstreamConverter.h
blob6548eae8c399abd357e453c755a4a6564a7cba3c
1 /*
2 * Copyright (C) 2010-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #pragma once
11 #include "cores/FFmpeg.h"
13 #include <stdint.h>
15 extern "C" {
16 #include <libavutil/avutil.h>
17 #include <libavformat/avformat.h>
18 #include <libavfilter/avfilter.h>
19 #include <libavcodec/avcodec.h>
22 typedef struct
24 const uint8_t *data;
25 const uint8_t *end;
26 int head;
27 uint64_t cache;
28 } nal_bitstream;
30 typedef struct mpeg2_sequence
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;
38 } mpeg2_sequence;
40 typedef struct
42 int profile_idc;
43 int level_idc;
44 int sps_id;
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;
53 int log2_max_frame_num_minus4;
54 int pic_order_cnt_type;
55 int log2_max_pic_order_cnt_lsb_minus4;
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;
62 int frame_mbs_only_flag;
63 int mb_adaptive_frame_field_flag;
65 int direct_8x8_inference_flag;
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;
72 } sps_info_struct;
74 class CBitstreamParser
76 public:
77 CBitstreamParser();
78 ~CBitstreamParser() = default;
80 static bool Open() { return true; }
81 static void Close();
82 static bool CanStartDecode(const uint8_t *buf, int buf_size);
85 class CBitstreamConverter
87 public:
88 CBitstreamConverter();
89 ~CBitstreamConverter();
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; }
106 static bool mpeg2_sequence_header(const uint8_t *data, const uint32_t size, mpeg2_sequence *sequence);
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);
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;
132 } omx_bitstream_ctx;
134 uint8_t *m_convertBuffer;
135 int m_convertSize;
136 uint8_t *m_inputBuffer;
137 int m_inputSize;
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;
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;