Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
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
28
static
void
decode_nal_sei_decoded_picture_hash
(
HEVCContext
*s)
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
49
static
void
decode_nal_sei_frame_packing_arrangement
(
HEVCContext
*s)
50
{
51
GetBitContext
*gb = &s->
HEVClc
.
gb
;
52
53
get_ue_golomb
(gb);
// frame_packing_arrangement_id
54
s->
sei_frame_packing_present
= !
get_bits1
(gb);
55
56
if
(s->
sei_frame_packing_present
) {
57
s->
frame_packing_arrangement_type
=
get_bits
(gb, 7);
58
s->
quincunx_subsampling
=
get_bits1
(gb);
59
s->
content_interpretation_type
=
get_bits
(gb, 6);
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
66
if
(!s->
quincunx_subsampling
&& s->
frame_packing_arrangement_type
!= 5)
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
74
static
int
decode_nal_sei_message
(
HEVCContext
*s)
75
{
76
GetBitContext
*gb = &s->
HEVClc
.
gb
;
77
78
int
payload_type = 0;
79
int
payload_size = 0;
80
int
byte = 0xFF;
81
av_log
(s->
avctx
,
AV_LOG_DEBUG
,
"Decoding SEI\n"
);
82
83
while
(byte == 0xFF) {
84
byte =
get_bits
(gb, 8);
85
payload_type += byte;
86
}
87
byte = 0xFF;
88
while
(byte == 0xFF) {
89
byte =
get_bits
(gb, 8);
90
payload_size += byte;
91
}
92
if
(s->
nal_unit_type
==
NAL_SEI_PREFIX
) {
93
if
(payload_type == 256)
94
decode_nal_sei_decoded_picture_hash
(s);
95
else
if
(payload_type == 45)
96
decode_nal_sei_frame_packing_arrangement
(s);
97
else
{
98
av_log
(s->
avctx
,
AV_LOG_DEBUG
,
"Skipped PREFIX SEI %d\n"
, payload_type);
99
skip_bits
(gb, 8 * payload_size);
100
}
101
}
else
{
/* nal_unit_type == NAL_SEI_SUFFIX */
102
if
(payload_type == 132)
103
decode_nal_sei_decoded_picture_hash
(s);
104
else
{
105
av_log
(s->
avctx
,
AV_LOG_DEBUG
,
"Skipped SUFFIX SEI %d\n"
, payload_type);
106
skip_bits
(gb, 8 * payload_size);
107
}
108
}
109
return
0;
110
}
111
112
static
int
more_rbsp_data
(
GetBitContext
*gb)
113
{
114
return
get_bits_left
(gb) > 0 &&
show_bits
(gb, 8) != 0x80;
115
}
116
117
int
ff_hevc_decode_nal_sei
(
HEVCContext
*s)
118
{
119
do
{
120
decode_nal_sei_message
(s);
121
}
while
(
more_rbsp_data
(&s->
HEVClc
.
gb
));
122
return
0;
123
}
decode_nal_sei_decoded_picture_hash
static void decode_nal_sei_decoded_picture_hash(HEVCContext *s)
Definition:
hevc_sei.c:28
HEVCContext::frame_packing_arrangement_type
int frame_packing_arrangement_type
Definition:
hevc.h:861
HEVCContext::sei_frame_packing_present
int sei_frame_packing_present
frame packing arrangement variables
Definition:
hevc.h:860
HEVCContext::quincunx_subsampling
int quincunx_subsampling
Definition:
hevc.h:863
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition:
get_bits.h:240
HEVCContext::content_interpretation_type
int content_interpretation_type
Definition:
hevc.h:862
NAL_SEI_PREFIX
Definition:
hevc.h:118
more_rbsp_data
static int more_rbsp_data(GetBitContext *gb)
Definition:
hevc_sei.c:112
uint8_t
uint8_t
Definition:
audio_convert.c:194
HEVCContext::avctx
AVCodecContext * avctx
Definition:
hevc.h:762
HEVCContext
Definition:
hevc.h:760
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition:
get_bits.h:555
get_ue_golomb
static int get_ue_golomb(GetBitContext *gb)
read unsigned exp golomb code.
Definition:
golomb.h:53
HEVCContext::HEVClc
HEVCLocalContext HEVClc
Definition:
hevc.h:764
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition:
log.h:144
av_log
void av_log(void *avcl, int level, const char *fmt,...)
Definition:
log.c:148
hevc.h
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition:
get_bits.h:254
ff_hevc_decode_nal_sei
int ff_hevc_decode_nal_sei(HEVCContext *s)
Definition:
hevc_sei.c:117
HEVCContext::md5
uint8_t md5[3][16]
Definition:
hevc.h:848
HEVCContext::is_md5
uint8_t is_md5
Definition:
hevc.h:849
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition:
get_bits.h:271
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition:
get_bits.h:296
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition:
get_bits.h:263
HEVCLocalContext::gb
GetBitContext gb
Definition:
hevc.h:733
HEVCContext::nal_unit_type
enum NALUnitType nal_unit_type
Definition:
hevc.h:792
GetBitContext
Definition:
get_bits.h:53
decode_nal_sei_message
static int decode_nal_sei_message(HEVCContext *s)
Definition:
hevc_sei.c:74
decode_nal_sei_frame_packing_arrangement
static void decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
Definition:
hevc_sei.c:49
golomb.h
exp golomb vlc stuff
Generated on Fri Aug 15 2014 22:31:00 for Libav by
1.8.7