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
853cc025
Commit
853cc025
authored
May 16, 2014
by
Vittorio Giovara
Committed by
Anton Khirnov
May 19, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mov: store display matrix in a stream side data
Signed-off-by:
Anton Khirnov
<
anton@khirnov.net
>
parent
bddd8cbf
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
54 additions
and
10 deletions
+54
-10
isom.h
libavformat/isom.h
+2
-0
mov.c
libavformat/mov.c
+52
-10
No files found.
libavformat/isom.h
View file @
853cc025
...
...
@@ -135,6 +135,8 @@ typedef struct MOVStreamContext {
int64_t
track_end
;
///< used for dts generation in fragmented movie files
unsigned
int
rap_group_count
;
MOVSbgp
*
rap_group
;
int32_t
*
display_matrix
;
}
MOVStreamContext
;
typedef
struct
MOVContext
{
...
...
libavformat/mov.c
View file @
853cc025
...
...
@@ -2344,7 +2344,7 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int
width
;
int
height
;
int64_t
disp_transform
[
2
];
int
display_matrix
[
3
][
2
];
int
display_matrix
[
3
][
3
];
AVStream
*
st
;
MOVStreamContext
*
sc
;
int
version
;
...
...
@@ -2381,11 +2381,12 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
//read in the display matrix (outlined in ISO 14496-12, Section 6.2.2)
// they're kept in fixed point format through all calculations
// ignore u,v,z b/c we don't need the scale factor to calc aspect ratio
// save u,v,z to store the whole matrix in the AV_PKT_DATA_DISPLAYMATRIX
// side data, but the scale factor is not needed to calculate aspect ratio
for
(
i
=
0
;
i
<
3
;
i
++
)
{
display_matrix
[
i
][
0
]
=
avio_rb32
(
pb
);
// 16.16 fixed point
display_matrix
[
i
][
1
]
=
avio_rb32
(
pb
);
// 16.16 fixed point
avio_rb32
(
pb
);
// 2.30 fixed point (not used)
display_matrix
[
i
][
2
]
=
avio_rb32
(
pb
);
// 2.30 fixed point
}
width
=
avio_rb32
(
pb
);
// 16.16 fixed point track width
...
...
@@ -2393,6 +2394,25 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc
->
width
=
width
>>
16
;
sc
->
height
=
height
>>
16
;
// save the matrix when it is not the default identity
if
(
display_matrix
[
0
][
0
]
!=
(
1
<<
16
)
||
display_matrix
[
1
][
1
]
!=
(
1
<<
16
)
||
display_matrix
[
2
][
2
]
!=
(
1
<<
30
)
||
display_matrix
[
0
][
1
]
||
display_matrix
[
0
][
2
]
||
display_matrix
[
1
][
0
]
||
display_matrix
[
1
][
2
]
||
display_matrix
[
2
][
0
]
||
display_matrix
[
2
][
1
])
{
int
i
,
j
;
av_freep
(
&
sc
->
display_matrix
);
sc
->
display_matrix
=
av_malloc
(
sizeof
(
int32_t
)
*
9
);
if
(
!
sc
->
display_matrix
)
return
AVERROR
(
ENOMEM
);
for
(
i
=
0
;
i
<
3
;
i
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
sc
->
display_matrix
[
i
*
3
+
j
]
=
display_matrix
[
j
][
i
];
}
// transform the display width/height according to the matrix
// skip this if the display matrix is the default identity matrix
// or if it is rotating the picture, ex iPhone 3GS
...
...
@@ -2975,6 +2995,7 @@ static int mov_read_close(AVFormatContext *s)
av_freep
(
&
sc
->
stts_data
);
av_freep
(
&
sc
->
stps_data
);
av_freep
(
&
sc
->
rap_group
);
av_freep
(
&
sc
->
display_matrix
);
}
if
(
mov
->
dv_demux
)
{
...
...
@@ -3049,14 +3070,35 @@ static int mov_read_header(AVFormatContext *s)
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
AVStream
*
st
=
s
->
streams
[
i
];
MOVStreamContext
*
sc
=
st
->
priv_data
;
if
(
st
->
codec
->
codec_type
!=
AVMEDIA_TYPE_AUDIO
)
continue
;
err
=
ff_replaygain_export
(
st
,
s
->
metadata
);
if
(
err
<
0
)
{
mov_read_close
(
s
);
return
err
;
switch
(
st
->
codec
->
codec_type
)
{
case
AVMEDIA_TYPE_AUDIO
:
err
=
ff_replaygain_export
(
st
,
s
->
metadata
);
if
(
err
<
0
)
{
mov_read_close
(
s
);
return
err
;
}
break
;
case
AVMEDIA_TYPE_VIDEO
:
if
(
sc
->
display_matrix
)
{
AVPacketSideData
*
sd
,
*
tmp
;
tmp
=
av_realloc_array
(
st
->
side_data
,
st
->
nb_side_data
+
1
,
sizeof
(
*
tmp
));
if
(
!
tmp
)
return
AVERROR
(
ENOMEM
);
st
->
side_data
=
tmp
;
st
->
nb_side_data
++
;
sd
=
&
st
->
side_data
[
st
->
nb_side_data
-
1
];
sd
->
type
=
AV_PKT_DATA_DISPLAYMATRIX
;
sd
->
size
=
sizeof
(
int32_t
)
*
9
;
sd
->
data
=
(
uint8_t
*
)
sc
->
display_matrix
;
sc
->
display_matrix
=
NULL
;
}
break
;
}
}
...
...
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