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
9b7ab579
Commit
9b7ab579
authored
Nov 19, 2016
by
Baptiste Coudurier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavf/mxfenc: support creating s436m data tracks
parent
bb89109a
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
49 additions
and
5 deletions
+49
-5
mxf.c
libavformat/mxf.c
+1
-0
mxfdec.c
libavformat/mxfdec.c
+2
-0
mxfenc.c
libavformat/mxfenc.c
+46
-5
No files found.
libavformat/mxf.c
View file @
9b7ab579
...
...
@@ -28,6 +28,7 @@
const
MXFCodecUL
ff_mxf_data_definition_uls
[]
=
{
{
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x01
,
0x01
,
0x03
,
0x02
,
0x02
,
0x01
,
0x00
,
0x00
,
0x00
},
13
,
AVMEDIA_TYPE_VIDEO
},
{
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x01
,
0x01
,
0x03
,
0x02
,
0x02
,
0x02
,
0x00
,
0x00
,
0x00
},
13
,
AVMEDIA_TYPE_AUDIO
},
{
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x01
,
0x01
,
0x03
,
0x02
,
0x02
,
0x03
,
0x00
,
0x00
,
0x00
},
13
,
AVMEDIA_TYPE_DATA
},
{
{
0x80
,
0x7D
,
0x00
,
0x60
,
0x08
,
0x14
,
0x3E
,
0x6F
,
0x6F
,
0x3C
,
0x8C
,
0xE1
,
0x6C
,
0xEF
,
0x11
,
0xD2
},
16
,
AVMEDIA_TYPE_VIDEO
},
/* LegacyPicture Avid Media Composer MXF */
{
{
0x80
,
0x7D
,
0x00
,
0x60
,
0x08
,
0x14
,
0x3E
,
0x6F
,
0x78
,
0xE1
,
0xEB
,
0xE1
,
0x6C
,
0xEF
,
0x11
,
0xD2
},
16
,
AVMEDIA_TYPE_AUDIO
},
/* LegacySound Avid Media Composer MXF */
{
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
0
,
AVMEDIA_TYPE_DATA
},
...
...
libavformat/mxfdec.c
View file @
9b7ab579
...
...
@@ -3311,6 +3311,8 @@ static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt)
if
(
ret
<
0
)
return
ret
;
}
else
if
(
track
)
{
pkt
->
dts
=
pkt
->
pts
=
track
->
sample_count
;
pkt
->
duration
=
1
;
track
->
sample_count
++
;
}
return
0
;
...
...
libavformat/mxfenc.c
View file @
9b7ab579
...
...
@@ -180,6 +180,7 @@ static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st);
static
void
mxf_write_mpegvideo_desc
(
AVFormatContext
*
s
,
AVStream
*
st
);
static
void
mxf_write_cdci_desc
(
AVFormatContext
*
s
,
AVStream
*
st
);
static
void
mxf_write_generic_sound_desc
(
AVFormatContext
*
s
,
AVStream
*
st
);
static
void
mxf_write_s436m_anc_desc
(
AVFormatContext
*
s
,
AVStream
*
st
);
static
const
MXFContainerEssenceEntry
mxf_essence_container_uls
[]
=
{
{
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x02
,
0x0D
,
0x01
,
0x03
,
0x01
,
0x02
,
0x04
,
0x60
,
0x01
},
...
...
@@ -391,6 +392,11 @@ static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x01
,
0x02
,
0x01
,
0x01
,
0x0D
,
0x01
,
0x03
,
0x01
,
0x15
,
0x01
,
0x05
,
0x00
},
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x0a
,
0x04
,
0x01
,
0x02
,
0x02
,
0x01
,
0x00
,
0x00
,
0x00
},
mxf_write_mpegvideo_desc
},
// S436M ANC
{
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x0a
,
0x0D
,
0x01
,
0x03
,
0x01
,
0x02
,
0x0e
,
0x00
,
0x00
},
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x01
,
0x02
,
0x01
,
0x01
,
0x0D
,
0x01
,
0x03
,
0x01
,
0x17
,
0x01
,
0x02
,
0x00
},
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x04
,
0x01
,
0x01
,
0x0a
,
0x04
,
0x01
,
0x02
,
0x02
,
0x01
,
0x01
,
0x5C
,
0x00
},
mxf_write_s436m_anc_desc
},
{
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
...
...
@@ -725,9 +731,14 @@ static void mxf_write_essence_container_refs(AVFormatContext *s)
mxf_write_refs_count
(
pb
,
DESCRIPTOR_COUNT
(
c
->
essence_container_count
));
av_log
(
s
,
AV_LOG_DEBUG
,
"essence container count:%d
\n
"
,
c
->
essence_container_count
);
for
(
i
=
0
;
i
<
c
->
essence_container_count
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
MXFStreamContext
*
sc
=
s
->
streams
[
i
]
->
priv_data
;
// check first track of essence container type and only write it once
if
(
sc
->
track_essence_element_key
[
15
]
!=
0
)
continue
;
avio_write
(
pb
,
mxf_essence_container_uls
[
sc
->
index
].
container_ul
,
16
);
if
(
c
->
essence_container_count
==
1
)
break
;
}
if
(
c
->
essence_container_count
>
1
)
...
...
@@ -1184,6 +1195,7 @@ static int64_t mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UI
return
pos
;
}
static
const
UID
mxf_s436m_anc_descriptor_key
=
{
0x06
,
0x0e
,
0x2b
,
0x34
,
0x02
,
0x53
,
0x01
,
0x01
,
0x0d
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x5c
,
0x00
};
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_wav_descriptor_key
=
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x02
,
0x53
,
0x01
,
0x01
,
0x0d
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x48
,
0x00
};
static
const
UID
mxf_aes3_descriptor_key
=
{
0x06
,
0x0E
,
0x2B
,
0x34
,
0x02
,
0x53
,
0x01
,
0x01
,
0x0d
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x47
,
0x00
};
...
...
@@ -1399,6 +1411,12 @@ static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
mxf_update_klv_size
(
s
->
pb
,
pos
);
}
static
void
mxf_write_s436m_anc_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
{
int64_t
pos
=
mxf_write_generic_desc
(
s
,
st
,
mxf_s436m_anc_descriptor_key
);
mxf_update_klv_size
(
s
->
pb
,
pos
);
}
static
void
mxf_write_mpegvideo_desc
(
AVFormatContext
*
s
,
AVStream
*
st
)
{
AVIOContext
*
pb
=
s
->
pb
;
...
...
@@ -1753,6 +1771,7 @@ static void mxf_write_index_table_segment(AVFormatContext *s)
int
i
,
j
,
temporal_reordering
=
0
;
int
key_index
=
mxf
->
last_key_index
;
int
prev_non_b_picture
=
0
;
int
audio_frame_size
=
0
;
int64_t
pos
;
av_log
(
s
,
AV_LOG_DEBUG
,
"edit units count %d
\n
"
,
mxf
->
edit_units_count
);
...
...
@@ -1822,9 +1841,11 @@ static void mxf_write_index_table_segment(AVFormatContext *s)
}
else
if
(
i
==
0
)
{
// video track
avio_w8
(
pb
,
0
);
// slice number
avio_wb32
(
pb
,
KAG_SIZE
);
// system item size including klv fill
}
else
{
// audio track
unsigned
audio_frame_size
=
sc
->
aic
.
samples
[
0
]
*
sc
->
aic
.
sample_size
;
audio_frame_size
+=
klv_fill_size
(
audio_frame_size
);
}
else
{
// audio or data track
if
(
!
audio_frame_size
)
{
audio_frame_size
=
sc
->
aic
.
samples
[
0
]
*
sc
->
aic
.
sample_size
;
audio_frame_size
+=
klv_fill_size
(
audio_frame_size
);
}
avio_w8
(
pb
,
1
);
avio_wb32
(
pb
,
(
i
-
1
)
*
audio_frame_size
);
// element delta
}
...
...
@@ -2556,6 +2577,18 @@ static int mxf_write_header(AVFormatContext *s)
sc
->
frame_size
=
(
st
->
codecpar
->
channels
*
spf
[
0
].
samples_per_frame
[
0
]
*
av_get_bits_per_sample
(
st
->
codecpar
->
codec_id
))
/
8
;
}
}
else
if
(
st
->
codecpar
->
codec_type
==
AVMEDIA_TYPE_DATA
)
{
AVDictionaryEntry
*
e
=
av_dict_get
(
st
->
metadata
,
"data_type"
,
NULL
,
0
);
if
(
e
&&
!
strcmp
(
e
->
value
,
"vbi_vanc_smpte_436M"
))
{
sc
->
index
=
38
;
}
else
{
av_log
(
s
,
AV_LOG_ERROR
,
"track %d: unsupported data type
\n
"
,
i
);
return
-
1
;
}
if
(
st
->
index
!=
s
->
nb_streams
-
1
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"data track must be placed last
\n
"
);
return
-
1
;
}
}
if
(
!
sc
->
index
)
{
...
...
@@ -2625,13 +2658,21 @@ static void mxf_write_system_item(AVFormatContext *s)
AVIOContext
*
pb
=
s
->
pb
;
unsigned
frame
;
uint32_t
time_code
;
int
i
,
system_item_bitmap
=
0x58
;
// UL, user date/time stamp, picture present
frame
=
mxf
->
last_indexed_edit_unit
+
mxf
->
edit_units_count
;
// write system metadata pack
avio_write
(
pb
,
system_metadata_pack_key
,
16
);
klv_encode_ber4_length
(
pb
,
57
);
avio_w8
(
pb
,
0x5c
);
// UL, user date/time stamp, picture and sound item present
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
if
(
s
->
streams
[
i
]
->
codecpar
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
system_item_bitmap
|=
0x4
;
else
if
(
s
->
streams
[
i
]
->
codecpar
->
codec_type
==
AVMEDIA_TYPE_DATA
)
system_item_bitmap
|=
0x2
;
}
avio_w8
(
pb
,
system_item_bitmap
);
avio_w8
(
pb
,
mxf
->
content_package_rate
);
// content package rate
avio_w8
(
pb
,
0x00
);
// content package type
avio_wb16
(
pb
,
0x00
);
// channel handle
...
...
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