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
1a61c7a5
Commit
1a61c7a5
authored
Nov 24, 2012
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wvenc: multichannel muxing
Signed-off-by:
Paul B Mahol
<
onemda@gmail.com
>
parent
1b9467ae
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
50 additions
and
6 deletions
+50
-6
wvenc.c
libavformat/wvenc.c
+50
-6
No files found.
libavformat/wvenc.c
View file @
1a61c7a5
...
...
@@ -19,19 +19,21 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/intreadwrite.h"
#include "avformat.h"
#include "internal.h"
#include "avio_internal.h"
#include "apetag.h"
#define WV_EXTRA_SIZE 12
#define WV_END_BLOCK 0x1000
typedef
struct
{
uint32_t
duration
;
int
off
;
}
WVMuxContext
;
static
int
write_header
(
AVFormatContext
*
s
)
{
WVMuxContext
*
wc
=
s
->
priv_data
;
AVCodecContext
*
codec
=
s
->
streams
[
0
]
->
codec
;
if
(
s
->
nb_streams
>
1
)
{
...
...
@@ -46,7 +48,6 @@ static int write_header(AVFormatContext *s)
av_log_missing_feature
(
s
,
"remuxing from matroska container"
,
0
);
return
AVERROR_PATCHWELCOME
;
}
wc
->
off
=
codec
->
channels
>
2
?
4
:
0
;
avpriv_set_pts_info
(
s
->
streams
[
0
],
64
,
1
,
codec
->
sample_rate
);
return
0
;
...
...
@@ -55,18 +56,61 @@ static int write_header(AVFormatContext *s)
static
int
write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
WVMuxContext
*
wc
=
s
->
priv_data
;
AVCodecContext
*
codec
=
s
->
streams
[
0
]
->
codec
;
AVIOContext
*
pb
=
s
->
pb
;
uint64_t
size
;
uint32_t
flags
;
uint32_t
left
=
pkt
->
size
;
uint8_t
*
ptr
=
pkt
->
data
;
int
off
=
codec
->
channels
>
2
?
4
:
0
;
/* FIXME: Simplify decoder/demuxer so bellow code can support midstream
* change of stream parameters */
wc
->
duration
+=
pkt
->
duration
;
ffio_wfourcc
(
pb
,
"wvpk"
);
avio_wl32
(
pb
,
pkt
->
size
+
12
+
wc
->
off
);
if
(
off
)
{
size
=
AV_RL32
(
pkt
->
data
);
if
(
size
<=
12
)
return
AVERROR_INVALIDDATA
;
size
-=
12
;
}
else
{
size
=
pkt
->
size
;
}
if
(
size
+
off
>
left
)
return
AVERROR_INVALIDDATA
;
avio_wl32
(
pb
,
size
+
12
);
avio_wl16
(
pb
,
0x410
);
avio_w8
(
pb
,
0
);
avio_w8
(
pb
,
0
);
avio_wl32
(
pb
,
-
1
);
avio_wl32
(
pb
,
pkt
->
pts
);
avio_write
(
s
->
pb
,
pkt
->
data
,
pkt
->
size
);
avio_flush
(
s
->
pb
);
ptr
+=
off
;
left
-=
off
;
flags
=
AV_RL32
(
ptr
+
4
);
avio_write
(
pb
,
ptr
,
size
);
ptr
+=
size
;
left
-=
size
;
while
(
!
(
flags
&
WV_END_BLOCK
)
&&
(
left
>=
4
+
WV_EXTRA_SIZE
))
{
ffio_wfourcc
(
pb
,
"wvpk"
);
size
=
AV_RL32
(
ptr
);
ptr
+=
4
;
left
-=
4
;
if
(
size
<
24
||
size
-
24
>
left
)
return
AVERROR_INVALIDDATA
;
avio_wl32
(
pb
,
size
);
avio_wl16
(
pb
,
0x410
);
avio_w8
(
pb
,
0
);
avio_w8
(
pb
,
0
);
avio_wl32
(
pb
,
-
1
);
avio_wl32
(
pb
,
pkt
->
pts
);
flags
=
AV_RL32
(
ptr
+
4
);
avio_write
(
pb
,
ptr
,
WV_EXTRA_SIZE
);
ptr
+=
WV_EXTRA_SIZE
;
left
-=
WV_EXTRA_SIZE
;
avio_write
(
pb
,
ptr
,
size
-
24
);
ptr
+=
size
-
24
;
left
-=
size
-
24
;
}
avio_flush
(
pb
);
return
0
;
}
...
...
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