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
246f8695
Commit
246f8695
authored
Jul 07, 2014
by
Nidhi Makhijani
Committed by
Diego Biurrun
Jul 07, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vmd: Split audio and video decoder
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
3c650efb
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
238 additions
and
219 deletions
+238
-219
Makefile
libavcodec/Makefile
+2
-2
vmdaudio.c
libavcodec/vmdaudio.c
+233
-0
vmdvideo.c
libavcodec/vmdvideo.c
+3
-217
No files found.
libavcodec/Makefile
View file @
246f8695
...
...
@@ -390,8 +390,8 @@ OBJS-$(CONFIG_VBLE_DECODER) += vble.o
OBJS-$(CONFIG_VC1_DECODER)
+=
vc1dec.o
vc1.o
vc1data.o
vc1dsp.o
\
msmpeg4dec.o
msmpeg4.o
msmpeg4data.o
OBJS-$(CONFIG_VCR1_DECODER)
+=
vcr1.o
OBJS-$(CONFIG_VMDAUDIO_DECODER)
+=
vmda
v
.o
OBJS-$(CONFIG_VMDVIDEO_DECODER)
+=
vmd
av
.o
OBJS-$(CONFIG_VMDAUDIO_DECODER)
+=
vmda
udio
.o
OBJS-$(CONFIG_VMDVIDEO_DECODER)
+=
vmd
video
.o
OBJS-$(CONFIG_VMNC_DECODER)
+=
vmnc.o
OBJS-$(CONFIG_VORBIS_DECODER)
+=
vorbisdec.o
vorbisdsp.o
vorbis.o
\
vorbis_data.o
xiph.o
...
...
libavcodec/vmdaudio.c
0 → 100644
View file @
246f8695
/*
* Sierra VMD audio decoder
*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* Sierra VMD audio decoder
* by Vladimir "VAG" Gneushev (vagsoft at mail.ru)
* for more information on the Sierra VMD format, visit:
* http://www.pcisys.net/~melanson/codecs/
*
* The audio decoder, expects each encoded data
* chunk to be prepended with the appropriate 16-byte frame information
* record from the VMD file. It does not require the 0x330-byte VMD file
* header, but it does need the audio setup parameters passed in through
* normal libavcodec API means.
*/
#include <string.h>
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "internal.h"
#define BLOCK_TYPE_AUDIO 1
#define BLOCK_TYPE_INITIAL 2
#define BLOCK_TYPE_SILENCE 3
typedef
struct
VmdAudioContext
{
int
out_bps
;
int
chunk_size
;
}
VmdAudioContext
;
static
const
uint16_t
vmdaudio_table
[
128
]
=
{
0x000
,
0x008
,
0x010
,
0x020
,
0x030
,
0x040
,
0x050
,
0x060
,
0x070
,
0x080
,
0x090
,
0x0A0
,
0x0B0
,
0x0C0
,
0x0D0
,
0x0E0
,
0x0F0
,
0x100
,
0x110
,
0x120
,
0x130
,
0x140
,
0x150
,
0x160
,
0x170
,
0x180
,
0x190
,
0x1A0
,
0x1B0
,
0x1C0
,
0x1D0
,
0x1E0
,
0x1F0
,
0x200
,
0x208
,
0x210
,
0x218
,
0x220
,
0x228
,
0x230
,
0x238
,
0x240
,
0x248
,
0x250
,
0x258
,
0x260
,
0x268
,
0x270
,
0x278
,
0x280
,
0x288
,
0x290
,
0x298
,
0x2A0
,
0x2A8
,
0x2B0
,
0x2B8
,
0x2C0
,
0x2C8
,
0x2D0
,
0x2D8
,
0x2E0
,
0x2E8
,
0x2F0
,
0x2F8
,
0x300
,
0x308
,
0x310
,
0x318
,
0x320
,
0x328
,
0x330
,
0x338
,
0x340
,
0x348
,
0x350
,
0x358
,
0x360
,
0x368
,
0x370
,
0x378
,
0x380
,
0x388
,
0x390
,
0x398
,
0x3A0
,
0x3A8
,
0x3B0
,
0x3B8
,
0x3C0
,
0x3C8
,
0x3D0
,
0x3D8
,
0x3E0
,
0x3E8
,
0x3F0
,
0x3F8
,
0x400
,
0x440
,
0x480
,
0x4C0
,
0x500
,
0x540
,
0x580
,
0x5C0
,
0x600
,
0x640
,
0x680
,
0x6C0
,
0x700
,
0x740
,
0x780
,
0x7C0
,
0x800
,
0x900
,
0xA00
,
0xB00
,
0xC00
,
0xD00
,
0xE00
,
0xF00
,
0x1000
,
0x1400
,
0x1800
,
0x1C00
,
0x2000
,
0x3000
,
0x4000
};
static
av_cold
int
vmdaudio_decode_init
(
AVCodecContext
*
avctx
)
{
VmdAudioContext
*
s
=
avctx
->
priv_data
;
if
(
avctx
->
channels
<
1
||
avctx
->
channels
>
2
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid number of channels
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
avctx
->
block_align
<
1
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid block align
\n
"
);
return
AVERROR
(
EINVAL
);
}
avctx
->
channel_layout
=
avctx
->
channels
==
1
?
AV_CH_LAYOUT_MONO
:
AV_CH_LAYOUT_STEREO
;
if
(
avctx
->
bits_per_coded_sample
==
16
)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
else
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_U8
;
s
->
out_bps
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
);
s
->
chunk_size
=
avctx
->
block_align
+
avctx
->
channels
*
(
s
->
out_bps
==
2
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"%d channels, %d bits/sample, "
"block align = %d, sample rate = %d
\n
"
,
avctx
->
channels
,
avctx
->
bits_per_coded_sample
,
avctx
->
block_align
,
avctx
->
sample_rate
);
return
0
;
}
static
void
decode_audio_s16
(
int16_t
*
out
,
const
uint8_t
*
buf
,
int
buf_size
,
int
channels
)
{
int
ch
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
int
predictor
[
2
];
int
st
=
channels
-
1
;
/* decode initial raw sample */
for
(
ch
=
0
;
ch
<
channels
;
ch
++
)
{
predictor
[
ch
]
=
(
int16_t
)
AV_RL16
(
buf
);
buf
+=
2
;
*
out
++
=
predictor
[
ch
];
}
/* decode DPCM samples */
ch
=
0
;
while
(
buf
<
buf_end
)
{
uint8_t
b
=
*
buf
++
;
if
(
b
&
0x80
)
predictor
[
ch
]
-=
vmdaudio_table
[
b
&
0x7F
];
else
predictor
[
ch
]
+=
vmdaudio_table
[
b
];
predictor
[
ch
]
=
av_clip_int16
(
predictor
[
ch
]);
*
out
++
=
predictor
[
ch
];
ch
^=
st
;
}
}
static
int
vmdaudio_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
AVFrame
*
frame
=
data
;
const
uint8_t
*
buf
=
avpkt
->
data
;
const
uint8_t
*
buf_end
;
int
buf_size
=
avpkt
->
size
;
VmdAudioContext
*
s
=
avctx
->
priv_data
;
int
block_type
,
silent_chunks
,
audio_chunks
;
int
ret
;
uint8_t
*
output_samples_u8
;
int16_t
*
output_samples_s16
;
if
(
buf_size
<
16
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"skipping small junk packet
\n
"
);
*
got_frame_ptr
=
0
;
return
buf_size
;
}
block_type
=
buf
[
6
];
if
(
block_type
<
BLOCK_TYPE_AUDIO
||
block_type
>
BLOCK_TYPE_SILENCE
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"unknown block type: %d
\n
"
,
block_type
);
return
AVERROR
(
EINVAL
);
}
buf
+=
16
;
buf_size
-=
16
;
/* get number of silent chunks */
silent_chunks
=
0
;
if
(
block_type
==
BLOCK_TYPE_INITIAL
)
{
uint32_t
flags
;
if
(
buf_size
<
4
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"packet is too small
\n
"
);
return
AVERROR
(
EINVAL
);
}
flags
=
AV_RB32
(
buf
);
silent_chunks
=
av_popcount
(
flags
);
buf
+=
4
;
buf_size
-=
4
;
}
else
if
(
block_type
==
BLOCK_TYPE_SILENCE
)
{
silent_chunks
=
1
;
buf_size
=
0
;
// should already be zero but set it just to be sure
}
/* ensure output buffer is large enough */
audio_chunks
=
buf_size
/
s
->
chunk_size
;
/* drop incomplete chunks */
buf_size
=
audio_chunks
*
s
->
chunk_size
;
/* get output buffer */
frame
->
nb_samples
=
((
silent_chunks
+
audio_chunks
)
*
avctx
->
block_align
)
/
avctx
->
channels
;
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
0
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
output_samples_u8
=
frame
->
data
[
0
];
output_samples_s16
=
(
int16_t
*
)
frame
->
data
[
0
];
/* decode silent chunks */
if
(
silent_chunks
>
0
)
{
int
silent_size
=
FFMIN
(
avctx
->
block_align
*
silent_chunks
,
frame
->
nb_samples
*
avctx
->
channels
);
if
(
s
->
out_bps
==
2
)
{
memset
(
output_samples_s16
,
0x00
,
silent_size
*
2
);
output_samples_s16
+=
silent_size
;
}
else
{
memset
(
output_samples_u8
,
0x80
,
silent_size
);
output_samples_u8
+=
silent_size
;
}
}
/* decode audio chunks */
if
(
audio_chunks
>
0
)
{
buf_end
=
buf
+
(
buf_size
&
~
(
avctx
->
channels
>
1
));
while
(
buf
+
s
->
chunk_size
<=
buf_end
)
{
if
(
s
->
out_bps
==
2
)
{
decode_audio_s16
(
output_samples_s16
,
buf
,
s
->
chunk_size
,
avctx
->
channels
);
output_samples_s16
+=
avctx
->
block_align
;
}
else
{
memcpy
(
output_samples_u8
,
buf
,
s
->
chunk_size
);
output_samples_u8
+=
avctx
->
block_align
;
}
buf
+=
s
->
chunk_size
;
}
}
*
got_frame_ptr
=
1
;
return
avpkt
->
size
;
}
AVCodec
ff_vmdaudio_decoder
=
{
.
name
=
"vmdaudio"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Sierra VMD audio"
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_VMDAUDIO
,
.
priv_data_size
=
sizeof
(
VmdAudioContext
),
.
init
=
vmdaudio_decode_init
,
.
decode
=
vmdaudio_decode_frame
,
.
capabilities
=
CODEC_CAP_DR1
,
};
libavcodec/vmd
av
.c
→
libavcodec/vmd
video
.c
View file @
246f8695
/*
* Sierra VMD Audio & Video Decoders
* Copyright (C) 2004 the ffmpeg project
* Sierra VMD video decoder
*
* This file is part of Libav.
*
...
...
@@ -21,7 +20,7 @@
/**
* @file
* Sierra VMD
audio & video decoders
* Sierra VMD
video decoder
* by Vladimir "VAG" Gneushev (vagsoft at mail.ru)
* for more information on the Sierra VMD format, visit:
* http://www.pcisys.net/~melanson/codecs/
...
...
@@ -31,21 +30,13 @@
* codec initialization. Each encoded frame that is sent to this decoder
* is expected to be prepended with the appropriate 16-byte frame
* information record from the VMD file.
*
* The audio decoder, like the video decoder, expects each encoded data
* chunk to be prepended with the appropriate 16-byte frame information
* record from the VMD file. It does not require the 0x330-byte VMD file
* header, but it does need the audio setup parameters passed in through
* normal libavcodec API means.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "internal.h"
#include "bytestream.h"
...
...
@@ -53,10 +44,6 @@
#define VMD_HEADER_SIZE 0x330
#define PALETTE_COUNT 256
/*
* Video Decoder
*/
typedef
struct
VmdVideoContext
{
AVCodecContext
*
avctx
;
...
...
@@ -467,196 +454,6 @@ static int vmdvideo_decode_frame(AVCodecContext *avctx,
return
buf_size
;
}
/*
* Audio Decoder
*/
#define BLOCK_TYPE_AUDIO 1
#define BLOCK_TYPE_INITIAL 2
#define BLOCK_TYPE_SILENCE 3
typedef
struct
VmdAudioContext
{
int
out_bps
;
int
chunk_size
;
}
VmdAudioContext
;
static
const
uint16_t
vmdaudio_table
[
128
]
=
{
0x000
,
0x008
,
0x010
,
0x020
,
0x030
,
0x040
,
0x050
,
0x060
,
0x070
,
0x080
,
0x090
,
0x0A0
,
0x0B0
,
0x0C0
,
0x0D0
,
0x0E0
,
0x0F0
,
0x100
,
0x110
,
0x120
,
0x130
,
0x140
,
0x150
,
0x160
,
0x170
,
0x180
,
0x190
,
0x1A0
,
0x1B0
,
0x1C0
,
0x1D0
,
0x1E0
,
0x1F0
,
0x200
,
0x208
,
0x210
,
0x218
,
0x220
,
0x228
,
0x230
,
0x238
,
0x240
,
0x248
,
0x250
,
0x258
,
0x260
,
0x268
,
0x270
,
0x278
,
0x280
,
0x288
,
0x290
,
0x298
,
0x2A0
,
0x2A8
,
0x2B0
,
0x2B8
,
0x2C0
,
0x2C8
,
0x2D0
,
0x2D8
,
0x2E0
,
0x2E8
,
0x2F0
,
0x2F8
,
0x300
,
0x308
,
0x310
,
0x318
,
0x320
,
0x328
,
0x330
,
0x338
,
0x340
,
0x348
,
0x350
,
0x358
,
0x360
,
0x368
,
0x370
,
0x378
,
0x380
,
0x388
,
0x390
,
0x398
,
0x3A0
,
0x3A8
,
0x3B0
,
0x3B8
,
0x3C0
,
0x3C8
,
0x3D0
,
0x3D8
,
0x3E0
,
0x3E8
,
0x3F0
,
0x3F8
,
0x400
,
0x440
,
0x480
,
0x4C0
,
0x500
,
0x540
,
0x580
,
0x5C0
,
0x600
,
0x640
,
0x680
,
0x6C0
,
0x700
,
0x740
,
0x780
,
0x7C0
,
0x800
,
0x900
,
0xA00
,
0xB00
,
0xC00
,
0xD00
,
0xE00
,
0xF00
,
0x1000
,
0x1400
,
0x1800
,
0x1C00
,
0x2000
,
0x3000
,
0x4000
};
static
av_cold
int
vmdaudio_decode_init
(
AVCodecContext
*
avctx
)
{
VmdAudioContext
*
s
=
avctx
->
priv_data
;
if
(
avctx
->
channels
<
1
||
avctx
->
channels
>
2
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid number of channels
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
avctx
->
block_align
<
1
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid block align
\n
"
);
return
AVERROR
(
EINVAL
);
}
avctx
->
channel_layout
=
avctx
->
channels
==
1
?
AV_CH_LAYOUT_MONO
:
AV_CH_LAYOUT_STEREO
;
if
(
avctx
->
bits_per_coded_sample
==
16
)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
else
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_U8
;
s
->
out_bps
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
);
s
->
chunk_size
=
avctx
->
block_align
+
avctx
->
channels
*
(
s
->
out_bps
==
2
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"%d channels, %d bits/sample, "
"block align = %d, sample rate = %d
\n
"
,
avctx
->
channels
,
avctx
->
bits_per_coded_sample
,
avctx
->
block_align
,
avctx
->
sample_rate
);
return
0
;
}
static
void
decode_audio_s16
(
int16_t
*
out
,
const
uint8_t
*
buf
,
int
buf_size
,
int
channels
)
{
int
ch
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
int
predictor
[
2
];
int
st
=
channels
-
1
;
/* decode initial raw sample */
for
(
ch
=
0
;
ch
<
channels
;
ch
++
)
{
predictor
[
ch
]
=
(
int16_t
)
AV_RL16
(
buf
);
buf
+=
2
;
*
out
++
=
predictor
[
ch
];
}
/* decode DPCM samples */
ch
=
0
;
while
(
buf
<
buf_end
)
{
uint8_t
b
=
*
buf
++
;
if
(
b
&
0x80
)
predictor
[
ch
]
-=
vmdaudio_table
[
b
&
0x7F
];
else
predictor
[
ch
]
+=
vmdaudio_table
[
b
];
predictor
[
ch
]
=
av_clip_int16
(
predictor
[
ch
]);
*
out
++
=
predictor
[
ch
];
ch
^=
st
;
}
}
static
int
vmdaudio_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
AVFrame
*
frame
=
data
;
const
uint8_t
*
buf
=
avpkt
->
data
;
const
uint8_t
*
buf_end
;
int
buf_size
=
avpkt
->
size
;
VmdAudioContext
*
s
=
avctx
->
priv_data
;
int
block_type
,
silent_chunks
,
audio_chunks
;
int
ret
;
uint8_t
*
output_samples_u8
;
int16_t
*
output_samples_s16
;
if
(
buf_size
<
16
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"skipping small junk packet
\n
"
);
*
got_frame_ptr
=
0
;
return
buf_size
;
}
block_type
=
buf
[
6
];
if
(
block_type
<
BLOCK_TYPE_AUDIO
||
block_type
>
BLOCK_TYPE_SILENCE
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"unknown block type: %d
\n
"
,
block_type
);
return
AVERROR
(
EINVAL
);
}
buf
+=
16
;
buf_size
-=
16
;
/* get number of silent chunks */
silent_chunks
=
0
;
if
(
block_type
==
BLOCK_TYPE_INITIAL
)
{
uint32_t
flags
;
if
(
buf_size
<
4
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"packet is too small
\n
"
);
return
AVERROR
(
EINVAL
);
}
flags
=
AV_RB32
(
buf
);
silent_chunks
=
av_popcount
(
flags
);
buf
+=
4
;
buf_size
-=
4
;
}
else
if
(
block_type
==
BLOCK_TYPE_SILENCE
)
{
silent_chunks
=
1
;
buf_size
=
0
;
// should already be zero but set it just to be sure
}
/* ensure output buffer is large enough */
audio_chunks
=
buf_size
/
s
->
chunk_size
;
/* drop incomplete chunks */
buf_size
=
audio_chunks
*
s
->
chunk_size
;
/* get output buffer */
frame
->
nb_samples
=
((
silent_chunks
+
audio_chunks
)
*
avctx
->
block_align
)
/
avctx
->
channels
;
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
0
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
ret
;
}
output_samples_u8
=
frame
->
data
[
0
];
output_samples_s16
=
(
int16_t
*
)
frame
->
data
[
0
];
/* decode silent chunks */
if
(
silent_chunks
>
0
)
{
int
silent_size
=
FFMIN
(
avctx
->
block_align
*
silent_chunks
,
frame
->
nb_samples
*
avctx
->
channels
);
if
(
s
->
out_bps
==
2
)
{
memset
(
output_samples_s16
,
0x00
,
silent_size
*
2
);
output_samples_s16
+=
silent_size
;
}
else
{
memset
(
output_samples_u8
,
0x80
,
silent_size
);
output_samples_u8
+=
silent_size
;
}
}
/* decode audio chunks */
if
(
audio_chunks
>
0
)
{
buf_end
=
buf
+
(
buf_size
&
~
(
avctx
->
channels
>
1
));
while
(
buf
+
s
->
chunk_size
<=
buf_end
)
{
if
(
s
->
out_bps
==
2
)
{
decode_audio_s16
(
output_samples_s16
,
buf
,
s
->
chunk_size
,
avctx
->
channels
);
output_samples_s16
+=
avctx
->
block_align
;
}
else
{
memcpy
(
output_samples_u8
,
buf
,
s
->
chunk_size
);
output_samples_u8
+=
avctx
->
block_align
;
}
buf
+=
s
->
chunk_size
;
}
}
*
got_frame_ptr
=
1
;
return
avpkt
->
size
;
}
/*
* Public Data Structures
*/
AVCodec
ff_vmdvideo_decoder
=
{
.
name
=
"vmdvideo"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Sierra VMD video"
),
...
...
@@ -668,14 +465,3 @@ AVCodec ff_vmdvideo_decoder = {
.
decode
=
vmdvideo_decode_frame
,
.
capabilities
=
CODEC_CAP_DR1
,
};
AVCodec
ff_vmdaudio_decoder
=
{
.
name
=
"vmdaudio"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Sierra VMD audio"
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_VMDAUDIO
,
.
priv_data_size
=
sizeof
(
VmdAudioContext
),
.
init
=
vmdaudio_decode_init
,
.
decode
=
vmdaudio_decode_frame
,
.
capabilities
=
CODEC_CAP_DR1
,
};
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