Libav
hevc_sei.c
Go to the documentation of this file.
1 /*
2  * HEVC Supplementary Enhancement Information messages
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
5  * Copyright (C) 2012 - 2013 Gildas Cocherel
6  * Copyright (C) 2013 Vittorio Giovara
7  *
8  * This file is part of Libav.
9  *
10  * Libav is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * Libav is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with Libav; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 #include "golomb.h"
26 #include "hevc.h"
27 
29 {
30  int cIdx, i;
31  GetBitContext *gb = &s->HEVClc.gb;
32  uint8_t hash_type = get_bits(gb, 8);
33 
34  for (cIdx = 0; cIdx < 3; cIdx++) {
35  if (hash_type == 0) {
36  s->is_md5 = 1;
37  for (i = 0; i < 16; i++)
38  s->md5[cIdx][i] = get_bits(gb, 8);
39  } else if (hash_type == 1) {
40  // picture_crc = get_bits(gb, 16);
41  skip_bits(gb, 16);
42  } else if (hash_type == 2) {
43  // picture_checksum = get_bits(gb, 32);
44  skip_bits(gb, 32);
45  }
46  }
47 }
48 
50 {
51  GetBitContext *gb = &s->HEVClc.gb;
52 
53  get_ue_golomb(gb); // frame_packing_arrangement_id
55 
60 
61  // the following skips spatial_flipping_flag frame0_flipped_flag
62  // field_views_flag current_frame_is_frame0_flag
63  // frame0_self_contained_flag frame1_self_contained_flag
64  skip_bits(gb, 6);
65 
67  skip_bits(gb, 16); // frame[01]_grid_position_[xy]
68  skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte
69  skip_bits1(gb); // frame_packing_arrangement_persistance_flag
70  }
71  skip_bits1(gb); // upsampled_aspect_ratio_flag
72 }
73 
75 {
76  GetBitContext *gb = &s->HEVClc.gb;
77 
79 
81  s->sei_hflip = get_bits1(gb); // hor_flip
82  s->sei_vflip = get_bits1(gb); // ver_flip
83 
85  skip_bits1(gb); // display_orientation_persistence_flag
86  }
87 }
88 
90 {
91  GetBitContext *gb = &s->HEVClc.gb;
92 
93  int payload_type = 0;
94  int payload_size = 0;
95  int byte = 0xFF;
96  av_log(s->avctx, AV_LOG_DEBUG, "Decoding SEI\n");
97 
98  while (byte == 0xFF) {
99  byte = get_bits(gb, 8);
100  payload_type += byte;
101  }
102  byte = 0xFF;
103  while (byte == 0xFF) {
104  byte = get_bits(gb, 8);
105  payload_size += byte;
106  }
107  if (s->nal_unit_type == NAL_SEI_PREFIX) {
108  if (payload_type == 256)
110  else if (payload_type == 45)
112  else if (payload_type == 47)
114  else {
115  av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
116  skip_bits(gb, 8 * payload_size);
117  }
118  } else { /* nal_unit_type == NAL_SEI_SUFFIX */
119  if (payload_type == 132)
121  else {
122  av_log(s->avctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", payload_type);
123  skip_bits(gb, 8 * payload_size);
124  }
125  }
126  return 0;
127 }
128 
130 {
131  return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80;
132 }
133 
135 {
136  do {
138  } while (more_rbsp_data(&s->HEVClc.gb));
139  return 0;
140 }
static void decode_nal_sei_decoded_picture_hash(HEVCContext *s)
Definition: hevc_sei.c:28
int frame_packing_arrangement_type
Definition: hevc.h:852
int sei_frame_packing_present
frame packing arrangement variables
Definition: hevc.h:851
int quincunx_subsampling
Definition: hevc.h:854
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
int content_interpretation_type
Definition: hevc.h:853
int sei_hflip
Definition: hevc.h:859
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
static int more_rbsp_data(GetBitContext *gb)
Definition: hevc_sei.c:129
uint8_t
AVCodecContext * avctx
Definition: hevc.h:754
static void decode_nal_sei_display_orientation(HEVCContext *s)
Definition: hevc_sei.c:74
int sei_anticlockwise_rotation
Definition: hevc.h:858
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:555
static int get_ue_golomb(GetBitContext *gb)
read unsigned exp golomb code.
Definition: golomb.h:53
HEVCLocalContext HEVClc
Definition: hevc.h:756
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:144
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:254
int sei_display_orientation_present
display orientation
Definition: hevc.h:857
int ff_hevc_decode_nal_sei(HEVCContext *s)
Definition: hevc_sei.c:134
uint8_t md5[3][16]
Definition: hevc.h:839
uint8_t is_md5
Definition: hevc.h:840
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:271
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:296
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:263
GetBitContext gb
Definition: hevc.h:721
enum NALUnitType nal_unit_type
Definition: hevc.h:784
int sei_vflip
Definition: hevc.h:859
static int decode_nal_sei_message(HEVCContext *s)
Definition: hevc_sei.c:89
static void decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
Definition: hevc_sei.c:49
exp golomb vlc stuff