Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
04a68f43
Commit
04a68f43
authored
Jun 30, 2015
by
Nicolas DEROUINEAU
Committed by
Michael Niedermayer
Jun 30, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/h264: Greenmetadata SEI parsing
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
7e9c7b62
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
89 additions
and
0 deletions
+89
-0
codecs.texi
doc/codecs.texi
+3
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
h264.h
libavcodec/h264.h
+21
-0
h264_sei.c
libavcodec/h264_sei.c
+63
-0
options_table.h
libavcodec/options_table.h
+1
-0
No files found.
doc/codecs.texi
View file @
04a68f43
...
...
@@ -475,6 +475,9 @@ per-block quantization parameter (QP)
motion vector
@item dct_coeff
@item green_metadata
display complexity metadata for the upcoming frame, GoP or for a given duration.
@item skip
@item startcode
...
...
libavcodec/avcodec.h
View file @
04a68f43
...
...
@@ -2616,6 +2616,7 @@ typedef struct AVCodecContext {
#endif
#define FF_DEBUG_BUFFERS 0x00008000
#define FF_DEBUG_THREADS 0x00010000
#define FF_DEBUG_GREEN_MD 0x00800000
#define FF_DEBUG_NOMC 0x01000000
#if FF_API_DEBUG_MV
...
...
libavcodec/h264.h
View file @
04a68f43
...
...
@@ -137,6 +137,7 @@ typedef enum {
SEI_TYPE_RECOVERY_POINT
=
6
,
///< recovery point (frame # to decoder sync)
SEI_TYPE_FRAME_PACKING
=
45
,
///< frame packing arrangement
SEI_TYPE_DISPLAY_ORIENTATION
=
47
,
///< display orientation
SEI_TYPE_GREEN_METADATA
=
56
///< GreenMPEG information
}
SEI_Type
;
/**
...
...
@@ -267,6 +268,22 @@ typedef struct FPA {
int
quincunx_sampling_flag
;
}
FPA
;
/**
* Green MetaData Information Type
*/
typedef
struct
GreenMetaData
{
uint8_t
green_metadata_type
;
uint8_t
period_type
;
uint16_t
num_seconds
;
uint16_t
num_pictures
;
uint8_t
percent_non_zero_macroblocks
;
uint8_t
percent_intra_coded_macroblocks
;
uint8_t
percent_six_tap_filtering
;
uint8_t
percent_alpha_point_deblocking_instance
;
uint8_t
xsd_metric_type
;
uint16_t
xsd_metric_value
;
}
GreenMetaData
;
/**
* Memory management control operation opcode.
*/
...
...
@@ -817,6 +834,10 @@ typedef struct H264Context {
/* Motion Estimation */
qpel_mc_func
(
*
qpel_put
)[
16
];
qpel_mc_func
(
*
qpel_avg
)[
16
];
/*Green Metadata */
GreenMetaData
sei_green_metadata
;
}
H264Context
;
extern
const
uint8_t
ff_h264_chroma_qp
[
7
][
QP_MAX_NUM
+
1
];
///< One chroma qp table for each possible bit depth (8-14).
...
...
libavcodec/h264_sei.c
View file @
04a68f43
...
...
@@ -294,6 +294,66 @@ static int decode_display_orientation(H264Context *h)
return
0
;
}
static
int
decode_GreenMetadata
(
H264Context
*
h
)
{
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"Green Metadata Info SEI message
\n
"
);
h
->
sei_green_metadata
.
green_metadata_type
=
get_bits
(
&
h
->
gb
,
8
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"green_metadata_type = %d
\n
"
,
h
->
sei_green_metadata
.
green_metadata_type
);
if
(
h
->
sei_green_metadata
.
green_metadata_type
==
0
){
h
->
sei_green_metadata
.
period_type
=
get_bits
(
&
h
->
gb
,
8
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"green_metadata_period_type = %d
\n
"
,
h
->
sei_green_metadata
.
period_type
);
if
(
h
->
sei_green_metadata
.
green_metadata_type
==
2
){
h
->
sei_green_metadata
.
num_seconds
=
get_bits
(
&
h
->
gb
,
16
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"green_metadata_num_seconds = %d
\n
"
,
h
->
sei_green_metadata
.
num_seconds
);
}
else
if
(
h
->
sei_green_metadata
.
period_type
==
3
){
h
->
sei_green_metadata
.
num_pictures
=
get_bits
(
&
h
->
gb
,
16
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"green_metadata_num_pictures = %d
\n
"
,
h
->
sei_green_metadata
.
num_pictures
);
}
h
->
sei_green_metadata
.
percent_non_zero_macroblocks
=
get_bits
(
&
h
->
gb
,
8
);
h
->
sei_green_metadata
.
percent_intra_coded_macroblocks
=
get_bits
(
&
h
->
gb
,
8
);
h
->
sei_green_metadata
.
percent_six_tap_filtering
=
get_bits
(
&
h
->
gb
,
8
);
h
->
sei_green_metadata
.
percent_alpha_point_deblocking_instance
=
get_bits
(
&
h
->
gb
,
8
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"SEI GREEN Complexity Metrics = %f %f %f %f
\n
"
,
(
float
)
h
->
sei_green_metadata
.
percent_non_zero_macroblocks
/
255
,
(
float
)
h
->
sei_green_metadata
.
percent_intra_coded_macroblocks
/
255
,
(
float
)
h
->
sei_green_metadata
.
percent_six_tap_filtering
/
255
,
(
float
)
h
->
sei_green_metadata
.
percent_alpha_point_deblocking_instance
/
255
);
}
else
if
(
h
->
sei_green_metadata
.
green_metadata_type
==
1
){
h
->
sei_green_metadata
.
xsd_metric_type
=
get_bits
(
&
h
->
gb
,
8
);
h
->
sei_green_metadata
.
xsd_metric_value
=
get_bits
(
&
h
->
gb
,
16
);
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"xsd_metric_type = %d
\n
"
,
h
->
sei_green_metadata
.
xsd_metric_type
);
if
(
h
->
sei_green_metadata
.
xsd_metric_type
==
0
){
if
(
h
->
avctx
->
debug
&
FF_DEBUG_GREEN_MD
)
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"xsd_metric_value = %f
\n
"
,
(
float
)
h
->
sei_green_metadata
.
xsd_metric_value
/
100
);
}
}
return
0
;
}
int
ff_h264_decode_sei
(
H264Context
*
h
)
{
while
(
get_bits_left
(
&
h
->
gb
)
>
16
&&
show_bits
(
&
h
->
gb
,
16
))
{
...
...
@@ -346,6 +406,9 @@ int ff_h264_decode_sei(H264Context *h)
case
SEI_TYPE_DISPLAY_ORIENTATION
:
ret
=
decode_display_orientation
(
h
);
break
;
case
SEI_TYPE_GREEN_METADATA
:
ret
=
decode_GreenMetadata
(
h
);
break
;
default:
av_log
(
h
->
avctx
,
AV_LOG_DEBUG
,
"unknown SEI type %d
\n
"
,
type
);
}
...
...
libavcodec/options_table.h
View file @
04a68f43
...
...
@@ -253,6 +253,7 @@ static const AVOption avcodec_options[] = {
{
"mv"
,
"motion vector"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_DEBUG_MV
},
INT_MIN
,
INT_MAX
,
V
|
D
,
"debug"
},
#endif
{
"dct_coeff"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_DEBUG_DCT_COEFF
},
INT_MIN
,
INT_MAX
,
V
|
D
,
"debug"
},
{
"green_metadata"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_DEBUG_GREEN_MD
},
INT_MIN
,
INT_MAX
,
V
|
D
,
"debug"
},
{
"skip"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_DEBUG_SKIP
},
INT_MIN
,
INT_MAX
,
V
|
D
,
"debug"
},
{
"startcode"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_DEBUG_STARTCODE
},
INT_MIN
,
INT_MAX
,
V
|
D
,
"debug"
},
#if FF_API_UNUSED_MEMBERS
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment