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
130de914
Commit
130de914
authored
Mar 21, 2018
by
Baptiste Coudurier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avformat/mxfenc: automatically update descriptors klv size
parent
9e611419
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
39 additions
and
41 deletions
+39
-41
mxfenc.c
libavformat/mxfenc.c
+39
-41
No files found.
libavformat/mxfenc.c
View file @
130de914
...
@@ -1104,14 +1104,16 @@ static void mxf_write_multi_descriptor(AVFormatContext *s)
...
@@ -1104,14 +1104,16 @@ static void mxf_write_multi_descriptor(AVFormatContext *s)
mxf_write_uuid
(
pb
,
SubDescriptor
,
i
);
mxf_write_uuid
(
pb
,
SubDescriptor
,
i
);
}
}
static
void
mxf_write_generic_desc
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
,
unsigned
size
)
static
int64_t
mxf_write_generic_desc
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
)
{
{
MXFContext
*
mxf
=
s
->
priv_data
;
MXFContext
*
mxf
=
s
->
priv_data
;
MXFStreamContext
*
sc
=
st
->
priv_data
;
MXFStreamContext
*
sc
=
st
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
int64_t
pos
;
avio_write
(
pb
,
key
,
16
);
avio_write
(
pb
,
key
,
16
);
klv_encode_ber4_length
(
pb
,
size
+
20
+
8
+
12
+
20
);
klv_encode_ber4_length
(
pb
,
0
);
pos
=
avio_tell
(
pb
);
mxf_write_local_tag
(
pb
,
16
,
0x3C0A
);
mxf_write_local_tag
(
pb
,
16
,
0x3C0A
);
mxf_write_uuid
(
pb
,
SubDescriptor
,
st
->
index
);
mxf_write_uuid
(
pb
,
SubDescriptor
,
st
->
index
);
...
@@ -1136,6 +1138,8 @@ static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID k
...
@@ -1136,6 +1138,8 @@ static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID k
mxf_write_local_tag
(
pb
,
16
,
0x3004
);
mxf_write_local_tag
(
pb
,
16
,
0x3004
);
avio_write
(
pb
,
mxf_essence_container_uls
[
sc
->
index
].
container_ul
,
16
);
avio_write
(
pb
,
mxf_essence_container_uls
[
sc
->
index
].
container_ul
,
16
);
return
pos
;
}
}
static
const
UID
mxf_mpegvideo_descriptor_key
=
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x02
,
0x53
,
0x01
,
0x01
,
0x0d
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x51
,
0x00
};
static
const
UID
mxf_mpegvideo_descriptor_key
=
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x02
,
0x53
,
0x01
,
0x01
,
0x0d
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x51
,
0x00
};
...
@@ -1172,7 +1176,7 @@ static int get_trc(UID ul, enum AVColorTransferCharacteristic trc)
...
@@ -1172,7 +1176,7 @@ static int get_trc(UID ul, enum AVColorTransferCharacteristic trc)
}
}
}
}
static
void
mxf_write_cdci_common
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
,
unsigned
size
)
static
int64_t
mxf_write_cdci_common
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
)
{
{
MXFStreamContext
*
sc
=
st
->
priv_data
;
MXFStreamContext
*
sc
=
st
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
...
@@ -1180,25 +1184,10 @@ static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID ke
...
@@ -1180,25 +1184,10 @@ static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID ke
int
stored_height
=
(
st
->
codecpar
->
height
+
15
)
/
16
*
16
;
int
stored_height
=
(
st
->
codecpar
->
height
+
15
)
/
16
*
16
;
int
display_height
;
int
display_height
;
int
f1
,
f2
;
int
f1
,
f2
;
unsigned
desc_size
=
size
+
8
+
8
+
8
+
8
+
8
+
8
+
8
+
5
+
16
+
4
+
12
+
20
+
5
+
5
*
8
+
6
;
UID
transfer_ul
=
{
0
};
UID
transfer_ul
=
{
0
};
int64_t
pos
=
mxf_write_generic_desc
(
s
,
st
,
key
);
if
(
sc
->
interlaced
&&
sc
->
field_dominance
)
get_trc
(
transfer_ul
,
st
->
codecpar
->
color_trc
);
desc_size
+=
5
;
if
(
sc
->
signal_standard
)
desc_size
+=
5
;
if
(
sc
->
interlaced
)
desc_size
+=
8
;
if
(
sc
->
v_chroma_sub_sample
)
desc_size
+=
8
;
if
(
st
->
codecpar
->
color_range
!=
AVCOL_RANGE_UNSPECIFIED
)
desc_size
+=
8
*
3
;
if
(
s
->
oformat
==
&
ff_mxf_d10_muxer
)
desc_size
+=
8
+
8
+
8
;
if
(
get_trc
(
transfer_ul
,
st
->
codecpar
->
color_trc
)
>=
0
)
desc_size
+=
20
;
mxf_write_generic_desc
(
s
,
st
,
key
,
desc_size
);
mxf_write_local_tag
(
pb
,
4
,
0x3203
);
mxf_write_local_tag
(
pb
,
4
,
0x3203
);
avio_wb32
(
pb
,
stored_width
);
avio_wb32
(
pb
,
stored_width
);
...
@@ -1352,11 +1341,22 @@ static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID ke
...
@@ -1352,11 +1341,22 @@ static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID ke
avio_w8
(
pb
,
sc
->
field_dominance
);
avio_w8
(
pb
,
sc
->
field_dominance
);
}
}
return
pos
;
}
static
void
mxf_update_klv_size
(
AVIOContext
*
pb
,
int64_t
pos
)
{
int64_t
cur_pos
=
avio_tell
(
pb
);
int
size
=
cur_pos
-
pos
;
avio_seek
(
pb
,
pos
-
4
,
SEEK_SET
);
klv_encode_ber4_length
(
pb
,
size
);
avio_seek
(
pb
,
cur_pos
,
SEEK_SET
);
}
}
static
void
mxf_write_cdci_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
static
void
mxf_write_cdci_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
{
{
mxf_write_cdci_common
(
s
,
st
,
mxf_cdci_descriptor_key
,
0
);
int64_t
pos
=
mxf_write_cdci_common
(
s
,
st
,
mxf_cdci_descriptor_key
);
mxf_update_klv_size
(
s
->
pb
,
pos
);
}
}
static
void
mxf_write_mpegvideo_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
static
void
mxf_write_mpegvideo_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
...
@@ -1364,10 +1364,9 @@ static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
...
@@ -1364,10 +1364,9 @@ static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
MXFStreamContext
*
sc
=
st
->
priv_data
;
MXFStreamContext
*
sc
=
st
->
priv_data
;
int
profile_and_level
=
(
st
->
codecpar
->
profile
<<
4
)
|
st
->
codecpar
->
level
;
int
profile_and_level
=
(
st
->
codecpar
->
profile
<<
4
)
|
st
->
codecpar
->
level
;
int64_t
pos
=
mxf_write_cdci_common
(
s
,
st
,
mxf_mpegvideo_descriptor_key
);
if
(
st
->
codecpar
->
codec_id
!=
AV_CODEC_ID_H264
)
{
if
(
st
->
codecpar
->
codec_id
!=
AV_CODEC_ID_H264
)
{
mxf_write_cdci_common
(
s
,
st
,
mxf_mpegvideo_descriptor_key
,
8
+
5
);
// bit rate
// bit rate
mxf_write_local_tag
(
pb
,
4
,
0x8000
);
mxf_write_local_tag
(
pb
,
4
,
0x8000
);
avio_wb32
(
pb
,
sc
->
video_bit_rate
);
avio_wb32
(
pb
,
sc
->
video_bit_rate
);
...
@@ -1377,26 +1376,19 @@ static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
...
@@ -1377,26 +1376,19 @@ static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
if
(
!
st
->
codecpar
->
profile
)
if
(
!
st
->
codecpar
->
profile
)
profile_and_level
|=
0x80
;
// escape bit
profile_and_level
|=
0x80
;
// escape bit
avio_w8
(
pb
,
profile_and_level
);
avio_w8
(
pb
,
profile_and_level
);
}
else
{
mxf_write_cdci_common
(
s
,
st
,
mxf_mpegvideo_descriptor_key
,
0
);
}
}
mxf_update_klv_size
(
pb
,
pos
);
}
}
static
void
mxf_write_generic_sound_common
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
,
unsigned
size
)
static
int64_t
mxf_write_generic_sound_common
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
)
{
{
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
MXFContext
*
mxf
=
s
->
priv_data
;
MXFContext
*
mxf
=
s
->
priv_data
;
int
show_warnings
=
!
mxf
->
footer_partition_offset
;
int
show_warnings
=
!
mxf
->
footer_partition_offset
;
int
duration_size
=
0
;
int
64_t
pos
=
mxf_write_generic_desc
(
s
,
st
,
key
)
;
if
(
s
->
oformat
==
&
ff_mxf_opatom_muxer
)
if
(
s
->
oformat
==
&
ff_mxf_opatom_muxer
)
{
duration_size
=
12
;
if
(
s
->
oformat
==
&
ff_mxf_d10_muxer
)
size
+=
5
;
mxf_write_generic_desc
(
s
,
st
,
key
,
size
+
duration_size
+
5
+
12
+
8
+
8
);
if
(
duration_size
>
0
)
{
mxf_write_local_tag
(
pb
,
8
,
0x3002
);
mxf_write_local_tag
(
pb
,
8
,
0x3002
);
avio_wb64
(
pb
,
mxf
->
body_offset
/
mxf
->
edit_unit_byte_count
);
avio_wb64
(
pb
,
mxf
->
body_offset
/
mxf
->
edit_unit_byte_count
);
}
}
...
@@ -1432,13 +1424,14 @@ static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, con
...
@@ -1432,13 +1424,14 @@ static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, con
mxf_write_local_tag
(
pb
,
4
,
0x3D01
);
mxf_write_local_tag
(
pb
,
4
,
0x3D01
);
avio_wb32
(
pb
,
av_get_bits_per_sample
(
st
->
codecpar
->
codec_id
));
avio_wb32
(
pb
,
av_get_bits_per_sample
(
st
->
codecpar
->
codec_id
));
return
pos
;
}
}
static
void
mxf_write_wav_common
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
,
unsigned
size
)
static
int64_t
mxf_write_wav_common
(
AVFormatContext
*
s
,
AVStream
*
st
,
const
UID
key
)
{
{
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
int64_t
pos
=
mxf_write_generic_sound_common
(
s
,
st
,
key
);
mxf_write_generic_sound_common
(
s
,
st
,
key
,
size
+
6
+
8
);
mxf_write_local_tag
(
pb
,
2
,
0x3D0A
);
mxf_write_local_tag
(
pb
,
2
,
0x3D0A
);
avio_wb16
(
pb
,
st
->
codecpar
->
block_align
);
avio_wb16
(
pb
,
st
->
codecpar
->
block_align
);
...
@@ -1446,21 +1439,26 @@ static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key
...
@@ -1446,21 +1439,26 @@ static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key
// avg bytes per sec
// avg bytes per sec
mxf_write_local_tag
(
pb
,
4
,
0x3D09
);
mxf_write_local_tag
(
pb
,
4
,
0x3D09
);
avio_wb32
(
pb
,
st
->
codecpar
->
block_align
*
st
->
codecpar
->
sample_rate
);
avio_wb32
(
pb
,
st
->
codecpar
->
block_align
*
st
->
codecpar
->
sample_rate
);
return
pos
;
}
}
static
void
mxf_write_wav_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
static
void
mxf_write_wav_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
{
{
mxf_write_wav_common
(
s
,
st
,
mxf_wav_descriptor_key
,
0
);
int64_t
pos
=
mxf_write_wav_common
(
s
,
st
,
mxf_wav_descriptor_key
);
mxf_update_klv_size
(
s
->
pb
,
pos
);
}
}
static
void
mxf_write_aes3_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
static
void
mxf_write_aes3_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
{
{
mxf_write_wav_common
(
s
,
st
,
mxf_aes3_descriptor_key
,
0
);
int64_t
pos
=
mxf_write_wav_common
(
s
,
st
,
mxf_aes3_descriptor_key
);
mxf_update_klv_size
(
s
->
pb
,
pos
);
}
}
static
void
mxf_write_generic_sound_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
static
void
mxf_write_generic_sound_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
{
{
mxf_write_generic_sound_common
(
s
,
st
,
mxf_generic_sound_descriptor_key
,
0
);
int64_t
pos
=
mxf_write_generic_sound_common
(
s
,
st
,
mxf_generic_sound_descriptor_key
);
mxf_update_klv_size
(
s
->
pb
,
pos
);
}
}
static
const
uint8_t
mxf_indirect_value_utf16le
[]
=
{
0x4c
,
0x00
,
0x02
,
0x10
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x06
,
0x0e
,
0x2b
,
0x34
,
0x01
,
0x04
,
0x01
,
0x01
};
static
const
uint8_t
mxf_indirect_value_utf16le
[]
=
{
0x4c
,
0x00
,
0x02
,
0x10
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x06
,
0x0e
,
0x2b
,
0x34
,
0x01
,
0x04
,
0x01
,
0x01
};
...
...
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