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
ef196bee
Commit
ef196bee
authored
Aug 22, 2013
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mov: Refactor audio specific parsing in mov_parse_stsd_audio
parent
a3b53ff0
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
87 additions
and
78 deletions
+87
-78
mov.c
libavformat/mov.c
+87
-78
No files found.
libavformat/mov.c
View file @
ef196bee
...
@@ -1206,6 +1206,92 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
...
@@ -1206,6 +1206,92 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
}
}
}
}
static
void
mov_parse_stsd_audio
(
MOVContext
*
c
,
AVIOContext
*
pb
,
AVStream
*
st
,
MOVStreamContext
*
sc
)
{
int
bits_per_sample
,
flags
;
uint16_t
version
=
avio_rb16
(
pb
);
avio_rb16
(
pb
);
/* revision level */
avio_rb32
(
pb
);
/* vendor */
st
->
codec
->
channels
=
avio_rb16
(
pb
);
/* channel count */
st
->
codec
->
bits_per_coded_sample
=
avio_rb16
(
pb
);
/* sample size */
av_dlog
(
c
->
fc
,
"audio channels %d
\n
"
,
st
->
codec
->
channels
);
sc
->
audio_cid
=
avio_rb16
(
pb
);
avio_rb16
(
pb
);
/* packet size = 0 */
st
->
codec
->
sample_rate
=
((
avio_rb32
(
pb
)
>>
16
));
// Read QT version 1 fields. In version 0 these do not exist.
av_dlog
(
c
->
fc
,
"version =%d, isom =%d
\n
"
,
version
,
c
->
isom
);
if
(
!
c
->
isom
)
{
if
(
version
==
1
)
{
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per packet */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per sample */
}
else
if
(
version
==
2
)
{
avio_rb32
(
pb
);
/* sizeof struct only */
st
->
codec
->
sample_rate
=
av_int2double
(
avio_rb64
(
pb
));
st
->
codec
->
channels
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* always 0x7F000000 */
st
->
codec
->
bits_per_coded_sample
=
avio_rb32
(
pb
);
flags
=
avio_rb32
(
pb
);
/* lpcm format specific flag */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
if
(
st
->
codec
->
codec_tag
==
MKTAG
(
'l'
,
'p'
,
'c'
,
'm'
))
st
->
codec
->
codec_id
=
ff_mov_get_lpcm_codec_id
(
st
->
codec
->
bits_per_coded_sample
,
flags
);
}
}
switch
(
st
->
codec
->
codec_id
)
{
case
AV_CODEC_ID_PCM_S8
:
case
AV_CODEC_ID_PCM_U8
:
if
(
st
->
codec
->
bits_per_coded_sample
==
16
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S16BE
;
break
;
case
AV_CODEC_ID_PCM_S16LE
:
case
AV_CODEC_ID_PCM_S16BE
:
if
(
st
->
codec
->
bits_per_coded_sample
==
8
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S8
;
else
if
(
st
->
codec
->
bits_per_coded_sample
==
24
)
st
->
codec
->
codec_id
=
st
->
codec
->
codec_id
==
AV_CODEC_ID_PCM_S16BE
?
AV_CODEC_ID_PCM_S24BE
:
AV_CODEC_ID_PCM_S24LE
;
break
;
/* set values for old format before stsd version 1 appeared */
case
AV_CODEC_ID_MACE3
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
2
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_MACE6
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
1
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_ADPCM_IMA_QT
:
sc
->
samples_per_frame
=
64
;
sc
->
bytes_per_frame
=
34
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_GSM
:
sc
->
samples_per_frame
=
160
;
sc
->
bytes_per_frame
=
33
;
break
;
default:
break
;
}
bits_per_sample
=
av_get_bits_per_sample
(
st
->
codec
->
codec_id
);
if
(
bits_per_sample
)
{
st
->
codec
->
bits_per_coded_sample
=
bits_per_sample
;
sc
->
sample_size
=
(
bits_per_sample
>>
3
)
*
st
->
codec
->
channels
;
}
}
int
ff_mov_read_stsd_entries
(
MOVContext
*
c
,
AVIOContext
*
pb
,
int
entries
)
int
ff_mov_read_stsd_entries
(
MOVContext
*
c
,
AVIOContext
*
pb
,
int
entries
)
{
{
AVStream
*
st
;
AVStream
*
st
;
...
@@ -1266,85 +1352,8 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
...
@@ -1266,85 +1352,8 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
st
->
codec
->
codec_id
=
id
;
st
->
codec
->
codec_id
=
id
;
mov_parse_stsd_video
(
c
,
pb
,
st
,
sc
);
mov_parse_stsd_video
(
c
,
pb
,
st
,
sc
);
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
{
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
{
int
bits_per_sample
,
flags
;
uint16_t
version
=
avio_rb16
(
pb
);
st
->
codec
->
codec_id
=
id
;
st
->
codec
->
codec_id
=
id
;
avio_rb16
(
pb
);
/* revision level */
mov_parse_stsd_audio
(
c
,
pb
,
st
,
sc
);
avio_rb32
(
pb
);
/* vendor */
st
->
codec
->
channels
=
avio_rb16
(
pb
);
/* channel count */
av_dlog
(
c
->
fc
,
"audio channels %d
\n
"
,
st
->
codec
->
channels
);
st
->
codec
->
bits_per_coded_sample
=
avio_rb16
(
pb
);
/* sample size */
sc
->
audio_cid
=
avio_rb16
(
pb
);
avio_rb16
(
pb
);
/* packet size = 0 */
st
->
codec
->
sample_rate
=
((
avio_rb32
(
pb
)
>>
16
));
//Read QT version 1 fields. In version 0 these do not exist.
av_dlog
(
c
->
fc
,
"version =%d, isom =%d
\n
"
,
version
,
c
->
isom
);
if
(
!
c
->
isom
)
{
if
(
version
==
1
)
{
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per packet */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* bytes per sample */
}
else
if
(
version
==
2
)
{
avio_rb32
(
pb
);
/* sizeof struct only */
st
->
codec
->
sample_rate
=
av_int2double
(
avio_rb64
(
pb
));
/* float 64 */
st
->
codec
->
channels
=
avio_rb32
(
pb
);
avio_rb32
(
pb
);
/* always 0x7F000000 */
st
->
codec
->
bits_per_coded_sample
=
avio_rb32
(
pb
);
/* bits per channel if sound is uncompressed */
flags
=
avio_rb32
(
pb
);
/* lpcm format specific flag */
sc
->
bytes_per_frame
=
avio_rb32
(
pb
);
/* bytes per audio packet if constant */
sc
->
samples_per_frame
=
avio_rb32
(
pb
);
/* lpcm frames per audio packet if constant */
if
(
format
==
MKTAG
(
'l'
,
'p'
,
'c'
,
'm'
))
st
->
codec
->
codec_id
=
ff_mov_get_lpcm_codec_id
(
st
->
codec
->
bits_per_coded_sample
,
flags
);
}
}
switch
(
st
->
codec
->
codec_id
)
{
case
AV_CODEC_ID_PCM_S8
:
case
AV_CODEC_ID_PCM_U8
:
if
(
st
->
codec
->
bits_per_coded_sample
==
16
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S16BE
;
break
;
case
AV_CODEC_ID_PCM_S16LE
:
case
AV_CODEC_ID_PCM_S16BE
:
if
(
st
->
codec
->
bits_per_coded_sample
==
8
)
st
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S8
;
else
if
(
st
->
codec
->
bits_per_coded_sample
==
24
)
st
->
codec
->
codec_id
=
st
->
codec
->
codec_id
==
AV_CODEC_ID_PCM_S16BE
?
AV_CODEC_ID_PCM_S24BE
:
AV_CODEC_ID_PCM_S24LE
;
break
;
/* set values for old format before stsd version 1 appeared */
case
AV_CODEC_ID_MACE3
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
2
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_MACE6
:
sc
->
samples_per_frame
=
6
;
sc
->
bytes_per_frame
=
1
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_ADPCM_IMA_QT
:
sc
->
samples_per_frame
=
64
;
sc
->
bytes_per_frame
=
34
*
st
->
codec
->
channels
;
break
;
case
AV_CODEC_ID_GSM
:
sc
->
samples_per_frame
=
160
;
sc
->
bytes_per_frame
=
33
;
break
;
default:
break
;
}
bits_per_sample
=
av_get_bits_per_sample
(
st
->
codec
->
codec_id
);
if
(
bits_per_sample
)
{
st
->
codec
->
bits_per_coded_sample
=
bits_per_sample
;
sc
->
sample_size
=
(
bits_per_sample
>>
3
)
*
st
->
codec
->
channels
;
}
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
){
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
){
// ttxt stsd contains display flags, justification, background
// ttxt stsd contains display flags, justification, background
// color, fonts, and default styles, so fake an atom to read it
// color, fonts, and default styles, so fake an atom to read it
...
...
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