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
569721ac
Commit
569721ac
authored
Aug 01, 2017
by
Mark Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: Add mpeg2_metadata bitstream filter
(cherry picked from commit
b78c30d7
)
parent
278c308c
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
351 additions
and
0 deletions
+351
-0
configure
configure
+1
-0
bitstream_filters.texi
doc/bitstream_filters.texi
+36
-0
Makefile
libavcodec/Makefile
+1
-0
bitstream_filters.c
libavcodec/bitstream_filters.c
+1
-0
mpeg2_metadata_bsf.c
libavcodec/mpeg2_metadata_bsf.c
+312
-0
No files found.
configure
View file @
569721ac
...
...
@@ -2917,6 +2917,7 @@ h264_metadata_bsf_select="cbs_h264"
h264_redundant_pps_bsf_select
=
"cbs_h264"
hevc_metadata_bsf_select
=
"cbs_h265"
mjpeg2jpeg_bsf_select
=
"jpegtables"
mpeg2_metadata_bsf_select
=
"cbs_mpeg2"
trace_headers_bsf_select
=
"cbs_h264 cbs_h265 cbs_mpeg2"
# external libraries
...
...
doc/bitstream_filters.texi
View file @
569721ac
...
...
@@ -324,6 +324,42 @@ See also the @ref{text2movsub} filter.
Decompress non-standard compressed MP3 audio headers.
@section mpeg2_metadata
Modify metadata embedded in an MPEG-2 stream.
@table @option
@item display_aspect_ratio
Set the display aspect ratio in the stream.
The following fixed values are supported:
@table @option
@item 4/3
@item 16/9
@item 221/100
@end table
Any other value will result in square pixels being signalled instead
(see H.262 section 6.3.3 and table 6-3).
@item frame_rate
Set the frame rate in the stream. This is constructed from a table
of known values combined with a small multiplier and divisor - if
the supplied value is not exactly representable, the nearest
representable value will be used instead (see H.262 section 6.3.3
and table 6-4).
@item video_format
Set the video format in the stream (see H.262 section 6.3.6 and
table 6-6).
@item colour_primaries
@item transfer_characteristics
@item matrix_coefficients
Set the colour description in the stream (see H.262 section 6.3.6
and tables 6-7, 6-8 and 6-9).
@end table
@section mpeg4_unpack_bframes
Unpack DivX-style packed B-frames.
...
...
libavcodec/Makefile
View file @
569721ac
...
...
@@ -1027,6 +1027,7 @@ OBJS-$(CONFIG_MPEG4_UNPACK_BFRAMES_BSF) += mpeg4_unpack_bframes_bsf.o
OBJS-$(CONFIG_MOV2TEXTSUB_BSF)
+=
movsub_bsf.o
OBJS-$(CONFIG_MP3_HEADER_DECOMPRESS_BSF)
+=
mp3_header_decompress_bsf.o
\
mpegaudiodata.o
OBJS-$(CONFIG_MPEG2_METADATA_BSF)
+=
mpeg2_metadata_bsf.o
OBJS-$(CONFIG_NOISE_BSF)
+=
noise_bsf.o
OBJS-$(CONFIG_NULL_BSF)
+=
null_bsf.o
OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)
+=
remove_extradata_bsf.o
...
...
libavcodec/bitstream_filters.c
View file @
569721ac
...
...
@@ -38,6 +38,7 @@ extern const AVBitStreamFilter ff_imx_dump_header_bsf;
extern
const
AVBitStreamFilter
ff_mjpeg2jpeg_bsf
;
extern
const
AVBitStreamFilter
ff_mjpega_dump_header_bsf
;
extern
const
AVBitStreamFilter
ff_mp3_header_decompress_bsf
;
extern
const
AVBitStreamFilter
ff_mpeg2_metadata_bsf
;
extern
const
AVBitStreamFilter
ff_mpeg4_unpack_bframes_bsf
;
extern
const
AVBitStreamFilter
ff_mov2textsub_bsf
;
extern
const
AVBitStreamFilter
ff_noise_bsf
;
...
...
libavcodec/mpeg2_metadata_bsf.c
0 → 100644
View file @
569721ac
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/avstring.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
#include "bsf.h"
#include "cbs.h"
#include "cbs_mpeg2.h"
#include "mpeg12.h"
typedef
struct
MPEG2MetadataContext
{
const
AVClass
*
class
;
CodedBitstreamContext
*
cbc
;
CodedBitstreamFragment
fragment
;
MPEG2RawExtensionData
sequence_display_extension
;
AVRational
display_aspect_ratio
;
AVRational
frame_rate
;
int
video_format
;
int
colour_primaries
;
int
transfer_characteristics
;
int
matrix_coefficients
;
int
mpeg1_warned
;
}
MPEG2MetadataContext
;
static
int
mpeg2_metadata_update_fragment
(
AVBSFContext
*
bsf
,
CodedBitstreamFragment
*
frag
)
{
MPEG2MetadataContext
*
ctx
=
bsf
->
priv_data
;
MPEG2RawSequenceHeader
*
sh
=
NULL
;
MPEG2RawSequenceExtension
*
se
=
NULL
;
MPEG2RawSequenceDisplayExtension
*
sde
=
NULL
;
int
i
,
se_pos
,
add_sde
=
0
;
for
(
i
=
0
;
i
<
frag
->
nb_units
;
i
++
)
{
if
(
frag
->
units
[
i
].
type
==
MPEG2_START_SEQUENCE_HEADER
)
{
sh
=
frag
->
units
[
i
].
content
;
}
else
if
(
frag
->
units
[
i
].
type
==
MPEG2_START_EXTENSION
)
{
MPEG2RawExtensionData
*
ext
=
frag
->
units
[
i
].
content
;
if
(
ext
->
extension_start_code_identifier
==
MPEG2_EXTENSION_SEQUENCE
)
{
se
=
&
ext
->
data
.
sequence
;
se_pos
=
i
;
}
else
if
(
ext
->
extension_start_code_identifier
==
MPEG2_EXTENSION_SEQUENCE_DISPLAY
)
{
sde
=
&
ext
->
data
.
sequence_display
;
}
}
}
if
(
!
sh
||
!
se
)
{
// No sequence header and sequence extension: not an MPEG-2 video
// sequence.
if
(
sh
&&
!
ctx
->
mpeg1_warned
)
{
av_log
(
bsf
,
AV_LOG_WARNING
,
"Stream contains a sequence "
"header but not a sequence extension: maybe it's "
"actually MPEG-1?
\n
"
);
ctx
->
mpeg1_warned
=
1
;
}
return
0
;
}
if
(
ctx
->
display_aspect_ratio
.
num
&&
ctx
->
display_aspect_ratio
.
den
)
{
int
num
,
den
;
av_reduce
(
&
num
,
&
den
,
ctx
->
display_aspect_ratio
.
num
,
ctx
->
display_aspect_ratio
.
den
,
65535
);
if
(
num
==
4
&&
den
==
3
)
sh
->
aspect_ratio_information
=
2
;
else
if
(
num
==
16
&&
den
==
9
)
sh
->
aspect_ratio_information
=
3
;
else
if
(
num
==
221
&&
den
==
100
)
sh
->
aspect_ratio_information
=
4
;
else
sh
->
aspect_ratio_information
=
1
;
}
if
(
ctx
->
frame_rate
.
num
&&
ctx
->
frame_rate
.
den
)
{
int
code
,
ext_n
,
ext_d
;
ff_mpeg12_find_best_frame_rate
(
ctx
->
frame_rate
,
&
code
,
&
ext_n
,
&
ext_d
,
0
);
sh
->
frame_rate_code
=
code
;
se
->
frame_rate_extension_n
=
ext_n
;
se
->
frame_rate_extension_d
=
ext_d
;
}
if
(
ctx
->
video_format
>=
0
||
ctx
->
colour_primaries
>=
0
||
ctx
->
transfer_characteristics
>=
0
||
ctx
->
matrix_coefficients
>=
0
)
{
if
(
!
sde
)
{
add_sde
=
1
;
ctx
->
sequence_display_extension
.
extension_start_code
=
MPEG2_START_EXTENSION
;
ctx
->
sequence_display_extension
.
extension_start_code_identifier
=
MPEG2_EXTENSION_SEQUENCE_DISPLAY
;
sde
=
&
ctx
->
sequence_display_extension
.
data
.
sequence_display
;
*
sde
=
(
MPEG2RawSequenceDisplayExtension
)
{
.
video_format
=
5
,
.
colour_description
=
0
,
.
colour_primaries
=
2
,
.
transfer_characteristics
=
2
,
.
matrix_coefficients
=
2
,
.
display_horizontal_size
=
se
->
horizontal_size_extension
<<
12
|
sh
->
horizontal_size_value
,
.
display_vertical_size
=
se
->
vertical_size_extension
<<
12
|
sh
->
vertical_size_value
,
};
}
if
(
ctx
->
video_format
>=
0
)
sde
->
video_format
=
ctx
->
video_format
;
if
(
ctx
->
colour_primaries
>=
0
||
ctx
->
transfer_characteristics
>=
0
||
ctx
->
matrix_coefficients
>=
0
)
{
sde
->
colour_description
=
1
;
if
(
ctx
->
colour_primaries
>=
0
)
sde
->
colour_primaries
=
ctx
->
colour_primaries
;
else
if
(
add_sde
)
sde
->
colour_primaries
=
2
;
if
(
ctx
->
transfer_characteristics
>=
0
)
sde
->
transfer_characteristics
=
ctx
->
transfer_characteristics
;
else
if
(
add_sde
)
sde
->
transfer_characteristics
=
2
;
if
(
ctx
->
matrix_coefficients
>=
0
)
sde
->
matrix_coefficients
=
ctx
->
matrix_coefficients
;
else
if
(
add_sde
)
sde
->
matrix_coefficients
=
2
;
}
}
if
(
add_sde
)
{
int
err
;
err
=
ff_cbs_insert_unit_content
(
ctx
->
cbc
,
frag
,
se_pos
+
1
,
MPEG2_START_EXTENSION
,
&
ctx
->
sequence_display_extension
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to insert new sequence "
"display extension.
\n
"
);
return
err
;
}
}
return
0
;
}
static
int
mpeg2_metadata_filter
(
AVBSFContext
*
bsf
,
AVPacket
*
out
)
{
MPEG2MetadataContext
*
ctx
=
bsf
->
priv_data
;
AVPacket
*
in
=
NULL
;
CodedBitstreamFragment
*
frag
=
&
ctx
->
fragment
;
int
err
;
err
=
ff_bsf_get_packet
(
bsf
,
&
in
);
if
(
err
<
0
)
goto
fail
;
err
=
ff_cbs_read_packet
(
ctx
->
cbc
,
frag
,
in
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to read packet.
\n
"
);
goto
fail
;
}
err
=
mpeg2_metadata_update_fragment
(
bsf
,
frag
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to update frame fragment.
\n
"
);
goto
fail
;
}
err
=
ff_cbs_write_packet
(
ctx
->
cbc
,
out
,
frag
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to write packet.
\n
"
);
goto
fail
;
}
err
=
av_packet_copy_props
(
out
,
in
);
if
(
err
<
0
)
{
av_packet_unref
(
out
);
goto
fail
;
}
err
=
0
;
fail:
ff_cbs_fragment_uninit
(
ctx
->
cbc
,
frag
);
av_packet_free
(
&
in
);
return
err
;
}
static
int
mpeg2_metadata_init
(
AVBSFContext
*
bsf
)
{
MPEG2MetadataContext
*
ctx
=
bsf
->
priv_data
;
CodedBitstreamFragment
*
frag
=
&
ctx
->
fragment
;
int
err
;
err
=
ff_cbs_init
(
&
ctx
->
cbc
,
AV_CODEC_ID_MPEG2VIDEO
,
bsf
);
if
(
err
<
0
)
return
err
;
if
(
bsf
->
par_in
->
extradata
)
{
err
=
ff_cbs_read_extradata
(
ctx
->
cbc
,
frag
,
bsf
->
par_in
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to read extradata.
\n
"
);
goto
fail
;
}
err
=
mpeg2_metadata_update_fragment
(
bsf
,
frag
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to update metadata fragment.
\n
"
);
goto
fail
;
}
err
=
ff_cbs_write_extradata
(
ctx
->
cbc
,
bsf
->
par_out
,
frag
);
if
(
err
<
0
)
{
av_log
(
bsf
,
AV_LOG_ERROR
,
"Failed to write extradata.
\n
"
);
goto
fail
;
}
}
err
=
0
;
fail:
ff_cbs_fragment_uninit
(
ctx
->
cbc
,
frag
);
return
err
;
}
static
void
mpeg2_metadata_close
(
AVBSFContext
*
bsf
)
{
MPEG2MetadataContext
*
ctx
=
bsf
->
priv_data
;
ff_cbs_close
(
&
ctx
->
cbc
);
}
#define OFFSET(x) offsetof(MPEG2MetadataContext, x)
static
const
AVOption
mpeg2_metadata_options
[]
=
{
{
"display_aspect_ratio"
,
"Set display aspect ratio (table 6-3)"
,
OFFSET
(
display_aspect_ratio
),
AV_OPT_TYPE_RATIONAL
,
{
.
dbl
=
0
.
0
},
0
,
65535
},
{
"frame_rate"
,
"Set frame rate"
,
OFFSET
(
frame_rate
),
AV_OPT_TYPE_RATIONAL
,
{
.
dbl
=
0
.
0
},
0
,
UINT_MAX
},
{
"video_format"
,
"Set video format (table 6-6)"
,
OFFSET
(
video_format
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
7
},
{
"colour_primaries"
,
"Set colour primaries (table 6-7)"
,
OFFSET
(
colour_primaries
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
255
},
{
"transfer_characteristics"
,
"Set transfer characteristics (table 6-8)"
,
OFFSET
(
transfer_characteristics
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
255
},
{
"matrix_coefficients"
,
"Set matrix coefficients (table 6-9)"
,
OFFSET
(
matrix_coefficients
),
AV_OPT_TYPE_INT
,
{
.
i64
=
-
1
},
-
1
,
255
},
{
NULL
}
};
static
const
AVClass
mpeg2_metadata_class
=
{
.
class_name
=
"mpeg2_metadata_bsf"
,
.
item_name
=
av_default_item_name
,
.
option
=
mpeg2_metadata_options
,
.
version
=
LIBAVCODEC_VERSION_MAJOR
,
};
static
const
enum
AVCodecID
mpeg2_metadata_codec_ids
[]
=
{
AV_CODEC_ID_MPEG2VIDEO
,
AV_CODEC_ID_NONE
,
};
const
AVBitStreamFilter
ff_mpeg2_metadata_bsf
=
{
.
name
=
"mpeg2_metadata"
,
.
priv_data_size
=
sizeof
(
MPEG2MetadataContext
),
.
priv_class
=
&
mpeg2_metadata_class
,
.
init
=
&
mpeg2_metadata_init
,
.
close
=
&
mpeg2_metadata_close
,
.
filter
=
&
mpeg2_metadata_filter
,
.
codec_ids
=
mpeg2_metadata_codec_ids
,
};
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