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
8bb5d1c3
Commit
8bb5d1c3
authored
Apr 23, 2011
by
Carl Eugen Hoyos
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support channel layout when demuxing caf files.
parent
2a2146aa
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
67 additions
and
0 deletions
+67
-0
caf.c
libavformat/caf.c
+58
-0
caf.h
libavformat/caf.h
+3
-0
cafdec.c
libavformat/cafdec.c
+6
-0
No files found.
libavformat/caf.c
View file @
8bb5d1c3
...
...
@@ -56,3 +56,61 @@ const AVCodecTag ff_codec_caf_tags[] = {
/*{ MPEG4TwinVQ MKBETAG('t','w','v','q') },*/
{
CODEC_ID_NONE
,
0
},
};
typedef
struct
CafChannelLayout
{
int64_t
channel_layout
;
uint32_t
layout_tag
;
}
CafChannelLayout
;
static
const
CafChannelLayout
caf_channel_layout
[]
=
{
{
AV_CH_LAYOUT_MONO
,
(
100
<<
16
)
|
1
},
//< kCAFChannelLayoutTag_Mono
{
AV_CH_LAYOUT_STEREO
,
(
101
<<
16
)
|
2
},
//< kCAFChannelLayoutTag_Stereo
{
AV_CH_LAYOUT_STEREO
,
(
102
<<
16
)
|
2
},
//< kCAFChannelLayoutTag_StereoHeadphones
{
AV_CH_LAYOUT_2_1
,
(
131
<<
16
)
|
3
},
//< kCAFChannelLayoutTag_ITU_2_1
{
AV_CH_LAYOUT_2_2
,
(
132
<<
16
)
|
4
},
//< kCAFChannelLayoutTag_ITU_2_2
{
AV_CH_LAYOUT_QUAD
,
(
108
<<
16
)
|
4
},
//< kCAFChannelLayoutTag_Quadraphonic
{
AV_CH_LAYOUT_SURROUND
,
(
113
<<
16
)
|
3
},
//< kCAFChannelLayoutTag_MPEG_3_0_A
{
AV_CH_LAYOUT_4POINT0
,
(
115
<<
16
)
|
4
},
//< kCAFChannelLayoutTag_MPEG_4_0_A
{
AV_CH_LAYOUT_5POINT0_BACK
,
(
117
<<
16
)
|
5
},
//< kCAFChannelLayoutTag_MPEG_5_0_A
{
AV_CH_LAYOUT_5POINT0
,
(
117
<<
16
)
|
5
},
//< kCAFChannelLayoutTag_MPEG_5_0_A
{
AV_CH_LAYOUT_5POINT1_BACK
,
(
121
<<
16
)
|
6
},
//< kCAFChannelLayoutTag_MPEG_5_1_A
{
AV_CH_LAYOUT_5POINT1
,
(
121
<<
16
)
|
6
},
//< kCAFChannelLayoutTag_MPEG_5_1_A
{
AV_CH_LAYOUT_7POINT1
,
(
128
<<
16
)
|
8
},
//< kCAFChannelLayoutTag_MPEG_7_1_C
{
AV_CH_LAYOUT_7POINT1_WIDE
,
(
126
<<
16
)
|
8
},
//< kCAFChannelLayoutTag_MPEG_7_1_A
{
AV_CH_LAYOUT_STEREO
|
AV_CH_LOW_FREQUENCY
,
(
133
<<
16
)
|
3
},
//< kCAFChannelLayoutTag_DVD_4
{
AV_CH_LAYOUT_2_1
|
AV_CH_LOW_FREQUENCY
,
(
134
<<
16
)
|
4
},
//< kCAFChannelLayoutTag_DVD_5
{
AV_CH_LAYOUT_2_2
|
AV_CH_LOW_FREQUENCY
,
(
135
<<
16
)
|
4
},
//< kCAFChannelLayoutTag_DVD_6
{
AV_CH_LAYOUT_SURROUND
|
AV_CH_LOW_FREQUENCY
,
(
136
<<
16
)
|
4
},
//< kCAFChannelLayoutTag_DVD_10
{
AV_CH_LAYOUT_4POINT0
|
AV_CH_LOW_FREQUENCY
,
(
137
<<
16
)
|
5
},
//< kCAFChannelLayoutTag_DVD_11
{
0
,
0
},
};
void
ff_read_chan_chunk
(
AVFormatContext
*
s
,
int64_t
size
,
AVCodecContext
*
codec
)
{
uint32_t
layout_tag
;
AVIOContext
*
pb
=
s
->
pb
;
const
CafChannelLayout
*
caf_layout
=
caf_channel_layout
;
if
(
size
!=
12
)
{
// Channel descriptions not implemented
av_log_ask_for_sample
(
s
,
"Unimplemented channel layout."
);
avio_skip
(
pb
,
size
);
return
;
}
layout_tag
=
avio_rb32
(
pb
);
if
(
layout_tag
==
0x10000
)
{
//< kCAFChannelLayoutTag_UseChannelBitmap
codec
->
channel_layout
=
avio_rb32
(
pb
);
avio_skip
(
pb
,
4
);
return
;
}
while
(
caf_layout
->
channel_layout
)
{
if
(
layout_tag
==
caf_layout
->
layout_tag
)
{
codec
->
channel_layout
=
caf_layout
->
channel_layout
;
break
;
}
caf_layout
++
;
}
if
(
!
codec
->
channel_layout
)
av_log
(
s
,
AV_LOG_WARNING
,
"Unknown channel layout."
);
avio_skip
(
pb
,
8
);
}
libavformat/caf.h
View file @
8bb5d1c3
...
...
@@ -27,8 +27,11 @@
#ifndef AVFORMAT_CAF_H
#define AVFORMAT_CAF_H
#include "avformat.h"
#include "internal.h"
extern
const
AVCodecTag
ff_codec_caf_tags
[];
void
ff_read_chan_chunk
(
AVFormatContext
*
s
,
int64_t
size
,
AVCodecContext
*
codec
);
#endif
/* AVFORMAT_CAF_H */
libavformat/cafdec.c
View file @
8bb5d1c3
...
...
@@ -257,6 +257,12 @@ static int read_header(AVFormatContext *s,
read_info_chunk
(
s
,
size
);
break
;
case
MKBETAG
(
'c'
,
'h'
,
'a'
,
'n'
):
if
(
size
<
12
)
return
AVERROR_INVALIDDATA
;
ff_read_chan_chunk
(
s
,
size
,
st
->
codec
);
break
;
default:
#define _(x) ((x) >= ' ' ? (x) : ' ')
av_log
(
s
,
AV_LOG_WARNING
,
"skipping CAF chunk: %08X (%c%c%c%c), size %"
PRId64
"
\n
"
,
...
...
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