History

avcodec/hevc/sei: add support for 3D Reference Displays Information SEI

James Almer committed 2 years ago

Commit efa9d3d1 parent 299d9112 files · +72 −0Browse files

Showing the changes to libavcodec (2 of 2 files). Show all

Unified · Split

2 files
  1. libavcodec/hevc/sei.c +55 −0
  2. libavcodec/hevc/sei.h +17 −0
libavcodec/hevc/sei.c+55−0
@@ -150,6 +150,59 @@ static int decode_nal_sei_timecode(HEVCSEITimeCode *s, GetBitContext *gb) · 149 unmodified lines
150150 return 0;
151151 }
152152
153+static int decode_nal_sei_3d_reference_displays_info(HEVCSEITDRDI *s, GetBitContext *gb)
154+{
155+ s->prec_ref_display_width = get_ue_golomb(gb);
156+ if (s->prec_ref_display_width > 31)
157+ return AVERROR_INVALIDDATA;
158+ s->ref_viewing_distance_flag = get_bits1(gb);
159+ if (s->ref_viewing_distance_flag) {
160+ s->prec_ref_viewing_dist = get_ue_golomb(gb);
161+ if (s->prec_ref_viewing_dist > 31)
162+ return AVERROR_INVALIDDATA;
163+ }
164+ s->num_ref_displays = get_ue_golomb(gb);
165+ if (s->num_ref_displays > 31)
166+ return AVERROR_INVALIDDATA;
167+ s->num_ref_displays += 1;
168+
169+ for (int i = 0; i < s->num_ref_displays; i++) {
170+ int length;
171+ s->left_view_id[i] = get_ue_golomb(gb);
172+ s->right_view_id[i] = get_ue_golomb(gb);
173+ s->exponent_ref_display_width[i] = get_bits(gb, 6);
174+ if (s->exponent_ref_display_width[i] > 62)
175+ return AVERROR_INVALIDDATA;
176+ else if (!s->exponent_ref_display_width[i])
177+ length = FFMAX(0, (int)s->prec_ref_display_width - 30);
178+ else
179+ length = FFMAX(0, (int)s->exponent_ref_display_width[i] +
180+ (int)s->prec_ref_display_width - 31);
181+ s->mantissa_ref_display_width[i] = get_bits_long(gb, length);
182+ if (s->ref_viewing_distance_flag) {
183+ s->exponent_ref_viewing_distance[i] = get_bits(gb, 6);
184+ if (s->exponent_ref_viewing_distance[i] > 62)
185+ return AVERROR_INVALIDDATA;
186+ else if (!s->exponent_ref_viewing_distance[i])
187+ length = FFMAX(0, (int)s->prec_ref_viewing_dist - 30);
188+ else
189+ length = FFMAX(0, (int)s->exponent_ref_viewing_distance[i] +
190+ (int)s->prec_ref_viewing_dist - 31);
191+ s->mantissa_ref_viewing_distance[i] = get_bits_long(gb, length);
192+ }
193+ s->additional_shift_present_flag[i] = get_bits1(gb);
194+ if (s->additional_shift_present_flag[i]) {
195+ s->num_sample_shift[i] = get_bits(gb, 10);
196+ if (s->num_sample_shift[i] > 1023)
197+ return AVERROR_INVALIDDATA;
198+ s->num_sample_shift[i] -= 512;
199+ }
200+ }
201+ s->three_dimensional_reference_displays_extension_flag = get_bits1(gb);
202+
203+ return 0;
204+}
205+
153206 static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte,
154207 void *logctx, HEVCSEI *s,
155208 const HEVCParamSets *ps, int type)
@@ -163,6 +216,8 @@ static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte, · 7 unmodified lines
163216 return decode_nal_sei_active_parameter_sets(s, gb, logctx);
164217 case SEI_TYPE_TIME_CODE:
165218 return decode_nal_sei_timecode(&s->timecode, gb);
219+ case SEI_TYPE_THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO:
220+ return decode_nal_sei_3d_reference_displays_info(&s->tdrdi, gb);
166221 default: {
167222 int ret = ff_h2645_sei_message_decode(&s->common, type, AV_CODEC_ID_HEVC,
168223 gb, gbyte, logctx);
libavcodec/hevc/sei.h+17−0
@@ -79,12 +79,29 @@ typedef struct HEVCSEITimeCode { · 78 unmodified lines
7979 int32_t time_offset_value[3];
8080 } HEVCSEITimeCode;
8181
82+typedef struct HEVCSEITDRDI {
83+ uint8_t prec_ref_display_width;
84+ uint8_t ref_viewing_distance_flag;
85+ uint8_t prec_ref_viewing_dist;
86+ uint8_t num_ref_displays;
87+ uint16_t left_view_id[31];
88+ uint16_t right_view_id[31];
89+ uint8_t exponent_ref_display_width[31];
90+ uint8_t mantissa_ref_display_width[31];
91+ uint8_t exponent_ref_viewing_distance[31];
92+ uint8_t mantissa_ref_viewing_distance[31];
93+ uint8_t additional_shift_present_flag[31];
94+ int16_t num_sample_shift[31];
95+ uint8_t three_dimensional_reference_displays_extension_flag;
96+} HEVCSEITDRDI;
97+
8298 typedef struct HEVCSEI {
8399 H2645SEI common;
84100 HEVCSEIPictureHash picture_hash;
85101 HEVCSEIPictureTiming picture_timing;
86102 int active_seq_parameter_set_id;
87103 HEVCSEITimeCode timecode;
104+ HEVCSEITDRDI tdrdi;
88105 } HEVCSEI;
89106
90107 struct HEVCParamSets;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t