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
5f022666
Commit
5f022666
authored
Mar 28, 2016
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
matroska: Support interlaced content correctly
The matroska specification now has two elements for it.
parent
44f05f15
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
43 additions
and
1 deletion
+43
-1
matroska.h
libavformat/matroska.h
+16
-0
matroskadec.c
libavformat/matroskadec.c
+27
-1
No files found.
libavformat/matroska.h
View file @
5f022666
...
...
@@ -113,6 +113,7 @@
#define MATROSKA_ID_VIDEOPIXELCROPR 0x54DD
#define MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2
#define MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A
#define MATROSKA_ID_VIDEOFIELDORDER 0x9D
#define MATROSKA_ID_VIDEOSTEREOMODE 0x53B8
#define MATROSKA_ID_VIDEOASPECTRATIO 0x54B3
#define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524
...
...
@@ -221,6 +222,21 @@ typedef enum {
MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
=
3
,
}
MatroskaTrackEncodingCompAlgo
;
typedef
enum
{
MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
=
0
,
MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
=
1
,
MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
=
2
}
MatroskaVideoInterlaceFlag
;
typedef
enum
{
MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
=
0
,
MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
=
2
,
MATROSKA_VIDEO_FIELDORDER_TT
=
1
,
MATROSKA_VIDEO_FIELDORDER_BB
=
6
,
MATROSKA_VIDEO_FIELDORDER_BT
=
9
,
MATROSKA_VIDEO_FIELDORDER_TB
=
14
,
}
MatroskaVideoFieldOrder
;
typedef
enum
{
MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
=
0
,
MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
=
1
,
...
...
libavformat/matroskadec.c
View file @
5f022666
...
...
@@ -123,6 +123,8 @@ typedef struct MatroskaTrackVideo {
uint64_t
pixel_width
;
uint64_t
pixel_height
;
uint64_t
fourcc
;
uint64_t
interlaced
;
uint64_t
field_order
;
uint64_t
stereo_mode
;
}
MatroskaTrackVideo
;
...
...
@@ -319,7 +321,8 @@ static EbmlSyntax matroska_track_video[] = {
{
MATROSKA_ID_VIDEOPIXELCROPL
,
EBML_NONE
},
{
MATROSKA_ID_VIDEOPIXELCROPR
,
EBML_NONE
},
{
MATROSKA_ID_VIDEODISPLAYUNIT
,
EBML_NONE
},
{
MATROSKA_ID_VIDEOFLAGINTERLACED
,
EBML_NONE
},
{
MATROSKA_ID_VIDEOFLAGINTERLACED
,
EBML_UINT
,
0
,
offsetof
(
MatroskaTrackVideo
,
interlaced
),
{
.
u
=
MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
}
},
{
MATROSKA_ID_VIDEOFIELDORDER
,
EBML_UINT
,
0
,
offsetof
(
MatroskaTrackVideo
,
field_order
),
{
.
u
=
MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
}
},
{
MATROSKA_ID_VIDEOSTEREOMODE
,
EBML_UINT
,
0
,
offsetof
(
MatroskaTrackVideo
,
stereo_mode
),
{
.
u
=
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
}
},
{
MATROSKA_ID_VIDEOASPECTRATIO
,
EBML_NONE
},
{
0
}
...
...
@@ -1525,6 +1528,26 @@ static int matroska_parse_flac(AVFormatContext *s,
return
0
;
}
static
int
mkv_field_order
(
int64_t
field_order
)
{
switch
(
field_order
)
{
case
MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
:
return
AV_FIELD_PROGRESSIVE
;
case
MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
:
return
AV_FIELD_UNKNOWN
;
case
MATROSKA_VIDEO_FIELDORDER_TT
:
return
AV_FIELD_TT
;
case
MATROSKA_VIDEO_FIELDORDER_BB
:
return
AV_FIELD_BB
;
case
MATROSKA_VIDEO_FIELDORDER_BT
:
return
AV_FIELD_BT
;
case
MATROSKA_VIDEO_FIELDORDER_TB
:
return
AV_FIELD_TB
;
default:
return
AV_FIELD_UNKNOWN
;
}
}
static
void
mkv_stereo_mode_display_mul
(
int
stereo_mode
,
int
*
h_width
,
int
*
h_height
)
{
...
...
@@ -1850,6 +1873,9 @@ static int matroska_parse_tracks(AVFormatContext *s)
st
->
codecpar
->
width
=
track
->
video
.
pixel_width
;
st
->
codecpar
->
height
=
track
->
video
.
pixel_height
;
if
(
track
->
video
.
interlaced
==
MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
)
st
->
codecpar
->
field_order
=
mkv_field_order
(
track
->
video
.
field_order
);
if
(
track
->
video
.
stereo_mode
&&
track
->
video
.
stereo_mode
<
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
)
mkv_stereo_mode_display_mul
(
track
->
video
.
stereo_mode
,
&
display_width_mul
,
&
display_height_mul
);
...
...
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