Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
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