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
fcc455ff
Commit
fcc455ff
authored
Aug 06, 2013
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avformat/dv: K&R formatting cosmetics
parent
abe5268c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
97 additions
and
79 deletions
+97
-79
dv.c
libavformat/dv.c
+97
-79
No files found.
libavformat/dv.c
View file @
fcc455ff
...
...
@@ -63,7 +63,7 @@ static inline uint16_t dv_audio_12to16(uint16_t sample)
shift
--
;
result
=
(
sample
-
(
256
*
shift
))
<<
shift
;
}
else
{
shift
=
0xe
-
shift
;
shift
=
0xe
-
shift
;
result
=
((
sample
+
((
256
*
shift
)
+
1
))
<<
shift
)
-
1
;
}
...
...
@@ -75,19 +75,19 @@ static inline uint16_t dv_audio_12to16(uint16_t sample)
* a fixed offset and if pack isn't there -- fails. We might want
* to have a fallback mechanism for complete search of missing packs.
*/
static
const
uint8_t
*
dv_extract_pack
(
uint8_t
*
frame
,
enum
dv_pack_type
t
)
static
const
uint8_t
*
dv_extract_pack
(
uint8_t
*
frame
,
enum
dv_pack_type
t
)
{
int
offs
;
switch
(
t
)
{
case
dv_audio_source
:
offs
=
(
80
*
6
+
80
*
16
*
3
+
3
);
offs
=
(
80
*
6
+
80
*
16
*
3
+
3
);
break
;
case
dv_audio_control
:
offs
=
(
80
*
6
+
80
*
16
*
4
+
3
);
offs
=
(
80
*
6
+
80
*
16
*
4
+
3
);
break
;
case
dv_video_control
:
offs
=
(
80
*
5
+
48
+
5
);
offs
=
(
80
*
5
+
48
+
5
);
break
;
default:
return
NULL
;
...
...
@@ -108,29 +108,29 @@ static const int dv_audio_frequency[3] = {
* 3. Audio is always returned as 16bit linear samples: 12bit nonlinear samples
* are converted into 16bit linear ones.
*/
static
int
dv_extract_audio
(
uint8_t
*
frame
,
uint8_t
*
ppcm
[
4
],
static
int
dv_extract_audio
(
uint8_t
*
frame
,
uint8_t
*
ppcm
[
4
],
const
DVprofile
*
sys
)
{
int
size
,
chan
,
i
,
j
,
d
,
of
,
smpls
,
freq
,
quant
,
half_ch
;
uint16_t
lc
,
rc
;
const
uint8_t
*
as_pack
;
const
uint8_t
*
as_pack
;
uint8_t
*
pcm
,
ipcm
;
as_pack
=
dv_extract_pack
(
frame
,
dv_audio_source
);
if
(
!
as_pack
)
/* No audio ? */
return
0
;
smpls
=
as_pack
[
1
]
&
0x3f
;
/* samples in this frame - min. samples */
freq
=
(
as_pack
[
4
]
>>
3
)
&
0x07
;
/* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
quant
=
as_pack
[
4
]
&
0x07
;
/* 0 - 16bit linear, 1 - 12bit nonlinear */
smpls
=
as_pack
[
1
]
&
0x3f
;
/* samples in this frame - min. samples */
freq
=
as_pack
[
4
]
>>
3
&
0x07
;
/* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
quant
=
as_pack
[
4
]
&
0x07
;
/* 0 - 16bit linear, 1 - 12bit nonlinear */
if
(
quant
>
1
)
return
-
1
;
/* unsupported quantization */
return
-
1
;
/* unsupported quantization */
if
(
freq
>=
FF_ARRAY_ELEMS
(
dv_audio_frequency
))
return
AVERROR_INVALIDDATA
;
size
=
(
sys
->
audio_min_samples
[
freq
]
+
smpls
)
*
4
;
/* 2ch, 2bytes */
size
=
(
sys
->
audio_min_samples
[
freq
]
+
smpls
)
*
4
;
/* 2ch, 2bytes */
half_ch
=
sys
->
difseg_size
/
2
;
/* We work with 720p frames split in half, thus even frames have
...
...
@@ -158,32 +158,41 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
for
(
j
=
0
;
j
<
9
;
j
++
)
{
for
(
d
=
8
;
d
<
80
;
d
+=
2
)
{
if
(
quant
==
0
)
{
/* 16bit quantization */
of
=
sys
->
audio_shuffle
[
i
][
j
]
+
(
d
-
8
)
/
2
*
sys
->
audio_stride
;
if
(
of
*
2
>=
size
)
of
=
sys
->
audio_shuffle
[
i
][
j
]
+
(
d
-
8
)
/
2
*
sys
->
audio_stride
;
if
(
of
*
2
>=
size
)
continue
;
pcm
[
of
*
2
]
=
frame
[
d
+
1
];
// FIXME: maybe we have to admit
pcm
[
of
*
2
+
1
]
=
frame
[
d
];
// that DV is a big-endian PCM
if
(
pcm
[
of
*
2
+
1
]
==
0x80
&&
pcm
[
of
*
2
]
==
0x00
)
pcm
[
of
*
2
+
1
]
=
0
;
/* FIXME: maybe we have to admit that DV is a
* big-endian PCM */
pcm
[
of
*
2
]
=
frame
[
d
+
1
];
pcm
[
of
*
2
+
1
]
=
frame
[
d
];
if
(
pcm
[
of
*
2
+
1
]
==
0x80
&&
pcm
[
of
*
2
]
==
0x00
)
pcm
[
of
*
2
+
1
]
=
0
;
}
else
{
/* 12bit quantization */
lc
=
((
uint16_t
)
frame
[
d
]
<<
4
)
|
((
uint16_t
)
frame
[
d
+
2
]
>>
4
);
rc
=
((
uint16_t
)
frame
[
d
+
1
]
<<
4
)
|
((
uint16_t
)
frame
[
d
+
2
]
&
0x0f
);
lc
=
((
uint16_t
)
frame
[
d
]
<<
4
)
|
((
uint16_t
)
frame
[
d
+
2
]
>>
4
);
rc
=
((
uint16_t
)
frame
[
d
+
1
]
<<
4
)
|
((
uint16_t
)
frame
[
d
+
2
]
&
0x0f
);
lc
=
(
lc
==
0x800
?
0
:
dv_audio_12to16
(
lc
));
rc
=
(
rc
==
0x800
?
0
:
dv_audio_12to16
(
rc
));
of
=
sys
->
audio_shuffle
[
i
%
half_ch
][
j
]
+
(
d
-
8
)
/
3
*
sys
->
audio_stride
;
if
(
of
*
2
>=
size
)
of
=
sys
->
audio_shuffle
[
i
%
half_ch
][
j
]
+
(
d
-
8
)
/
3
*
sys
->
audio_stride
;
if
(
of
*
2
>=
size
)
continue
;
pcm
[
of
*
2
]
=
lc
&
0xff
;
// FIXME: maybe we have to admit
pcm
[
of
*
2
+
1
]
=
lc
>>
8
;
// that DV is a big-endian PCM
of
=
sys
->
audio_shuffle
[
i
%
half_ch
+
half_ch
][
j
]
+
(
d
-
8
)
/
3
*
sys
->
audio_stride
;
pcm
[
of
*
2
]
=
rc
&
0xff
;
// FIXME: maybe we have to admit
pcm
[
of
*
2
+
1
]
=
rc
>>
8
;
// that DV is a big-endian PCM
/* FIXME: maybe we have to admit that DV is a
* big-endian PCM */
pcm
[
of
*
2
]
=
lc
&
0xff
;
pcm
[
of
*
2
+
1
]
=
lc
>>
8
;
of
=
sys
->
audio_shuffle
[
i
%
half_ch
+
half_ch
][
j
]
+
(
d
-
8
)
/
3
*
sys
->
audio_stride
;
/* FIXME: maybe we have to admit that DV is a
* big-endian PCM */
pcm
[
of
*
2
]
=
rc
&
0xff
;
pcm
[
of
*
2
+
1
]
=
rc
>>
8
;
++
d
;
}
}
...
...
@@ -196,9 +205,9 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
return
size
;
}
static
int
dv_extract_audio_info
(
DVDemuxContext
*
c
,
uint8_t
*
frame
)
static
int
dv_extract_audio_info
(
DVDemuxContext
*
c
,
uint8_t
*
frame
)
{
const
uint8_t
*
as_pack
;
const
uint8_t
*
as_pack
;
int
freq
,
stype
,
smpls
,
quant
,
i
,
ach
;
as_pack
=
dv_extract_pack
(
frame
,
dv_audio_source
);
...
...
@@ -207,10 +216,10 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
return
0
;
}
smpls
=
as_pack
[
1
]
&
0x3f
;
/* samples in this frame - min. samples */
freq
=
(
as_pack
[
4
]
>>
3
)
&
0x07
;
/* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
stype
=
(
as_pack
[
3
]
&
0x1f
);
/* 0 - 2CH, 2 - 4CH, 3 - 8CH */
quant
=
as_pack
[
4
]
&
0x07
;
/* 0 - 16bit linear, 1 - 12bit nonlinear */
smpls
=
as_pack
[
1
]
&
0x3f
;
/* samples in this frame - min. samples */
freq
=
as_pack
[
4
]
>>
3
&
0x07
;
/* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
stype
=
as_pack
[
3
]
&
0x1f
;
/* 0 - 2CH, 2 - 4CH, 3 - 8CH */
quant
=
as_pack
[
4
]
&
0x07
;
/* 0 - 16bit linear, 1 - 12bit nonlinear */
if
(
freq
>=
FF_ARRAY_ELEMS
(
dv_audio_frequency
))
{
av_log
(
c
->
fctx
,
AV_LOG_ERROR
,
...
...
@@ -225,7 +234,7 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
}
/* note: ach counts PAIRS of channels (i.e. stereo channels) */
ach
=
((
int
[
4
])
{
1
,
0
,
2
,
4
})[
stype
];
ach
=
((
int
[
4
])
{
1
,
0
,
2
,
4
})[
stype
];
if
(
ach
==
1
&&
quant
&&
freq
==
2
)
ach
=
2
;
...
...
@@ -245,21 +254,21 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
c
->
audio_pkt
[
i
].
stream_index
=
c
->
ast
[
i
]
->
index
;
c
->
audio_pkt
[
i
].
flags
|=
AV_PKT_FLAG_KEY
;
}
c
->
ast
[
i
]
->
codec
->
sample_rate
=
dv_audio_frequency
[
freq
];
c
->
ast
[
i
]
->
codec
->
channels
=
2
;
c
->
ast
[
i
]
->
codec
->
sample_rate
=
dv_audio_frequency
[
freq
];
c
->
ast
[
i
]
->
codec
->
channels
=
2
;
c
->
ast
[
i
]
->
codec
->
channel_layout
=
AV_CH_LAYOUT_STEREO
;
c
->
ast
[
i
]
->
codec
->
bit_rate
=
2
*
dv_audio_frequency
[
freq
]
*
16
;
c
->
ast
[
i
]
->
start_time
=
0
;
c
->
ast
[
i
]
->
codec
->
bit_rate
=
2
*
dv_audio_frequency
[
freq
]
*
16
;
c
->
ast
[
i
]
->
start_time
=
0
;
}
c
->
ach
=
i
;
return
(
c
->
sys
->
audio_min_samples
[
freq
]
+
smpls
)
*
4
;
/* 2ch, 2bytes */
;
return
(
c
->
sys
->
audio_min_samples
[
freq
]
+
smpls
)
*
4
;
/* 2ch, 2bytes */
}
static
int
dv_extract_video_info
(
DVDemuxContext
*
c
,
uint8_t
*
frame
)
static
int
dv_extract_video_info
(
DVDemuxContext
*
c
,
uint8_t
*
frame
)
{
const
uint8_t
*
vsc_pack
;
AVCodecContext
*
avctx
;
const
uint8_t
*
vsc_pack
;
AVCodecContext
*
avctx
;
int
apt
,
is16_9
;
int
size
=
0
;
...
...
@@ -268,9 +277,9 @@ static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame)
avpriv_set_pts_info
(
c
->
vst
,
64
,
c
->
sys
->
time_base
.
num
,
c
->
sys
->
time_base
.
den
);
avctx
->
time_base
=
c
->
sys
->
time_base
;
if
(
!
avctx
->
width
){
avctx
->
width
=
c
->
sys
->
width
;
avctx
->
time_base
=
c
->
sys
->
time_base
;
if
(
!
avctx
->
width
)
{
avctx
->
width
=
c
->
sys
->
width
;
avctx
->
height
=
c
->
sys
->
height
;
}
avctx
->
pix_fmt
=
c
->
sys
->
pix_fmt
;
...
...
@@ -281,18 +290,17 @@ static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame)
is16_9
=
(
vsc_pack
&&
((
vsc_pack
[
2
]
&
0x07
)
==
0x02
||
(
!
apt
&&
(
vsc_pack
[
2
]
&
0x07
)
==
0x07
)));
c
->
vst
->
sample_aspect_ratio
=
c
->
sys
->
sar
[
is16_9
];
avctx
->
bit_rate
=
av_rescale_q
(
c
->
sys
->
frame_size
,
(
AVRational
){
8
,
1
},
avctx
->
bit_rate
=
av_rescale_q
(
c
->
sys
->
frame_size
,
(
AVRational
)
{
8
,
1
},
c
->
sys
->
time_base
);
size
=
c
->
sys
->
frame_size
;
}
return
size
;
}
/*
* The following 3 functions constitute our interface to the world
*/
/* The following 3 functions constitute our interface to the world */
DVDemuxContext
*
avpriv_dv_init_demux
(
AVFormatContext
*
s
)
DVDemuxContext
*
avpriv_dv_init_demux
(
AVFormatContext
*
s
)
{
DVDemuxContext
*
c
;
...
...
@@ -322,9 +330,9 @@ int avpriv_dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
for
(
i
=
0
;
i
<
c
->
ach
;
i
++
)
{
if
(
c
->
ast
[
i
]
&&
c
->
audio_pkt
[
i
].
size
)
{
*
pkt
=
c
->
audio_pkt
[
i
];
*
pkt
=
c
->
audio_pkt
[
i
];
c
->
audio_pkt
[
i
].
size
=
0
;
size
=
pkt
->
size
;
size
=
pkt
->
size
;
break
;
}
}
...
...
@@ -333,10 +341,10 @@ int avpriv_dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
}
int
avpriv_dv_produce_packet
(
DVDemuxContext
*
c
,
AVPacket
*
pkt
,
uint8_t
*
buf
,
int
buf_size
)
uint8_t
*
buf
,
int
buf_size
)
{
int
size
,
i
;
uint8_t
*
ppcm
[
4
]
=
{
0
};
uint8_t
*
ppcm
[
4
]
=
{
0
};
if
(
buf_size
<
DV_PROFILE_BYTES
||
!
(
c
->
sys
=
avpriv_dv_frame_profile
(
c
->
sys
,
buf
,
buf_size
))
||
...
...
@@ -349,7 +357,8 @@ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
size
=
dv_extract_audio_info
(
c
,
buf
);
for
(
i
=
0
;
i
<
c
->
ach
;
i
++
)
{
c
->
audio_pkt
[
i
].
size
=
size
;
c
->
audio_pkt
[
i
].
pts
=
c
->
abytes
*
30000
*
8
/
c
->
ast
[
i
]
->
codec
->
bit_rate
;
c
->
audio_pkt
[
i
].
pts
=
c
->
abytes
*
30000
*
8
/
c
->
ast
[
i
]
->
codec
->
bit_rate
;
ppcm
[
i
]
=
c
->
audio_buf
[
i
];
}
if
(
c
->
ach
)
...
...
@@ -362,7 +371,7 @@ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
c
->
audio_pkt
[
2
].
size
=
c
->
audio_pkt
[
3
].
size
=
0
;
}
else
{
c
->
audio_pkt
[
0
].
size
=
c
->
audio_pkt
[
1
].
size
=
0
;
c
->
abytes
+=
size
;
c
->
abytes
+=
size
;
}
}
else
{
c
->
abytes
+=
size
;
...
...
@@ -383,28 +392,31 @@ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
}
static
int64_t
dv_frame_offset
(
AVFormatContext
*
s
,
DVDemuxContext
*
c
,
int64_t
timestamp
,
int
flags
)
int64_t
timestamp
,
int
flags
)
{
// FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
const
DVprofile
*
sys
=
avpriv_dv_codec_profile
(
c
->
vst
->
codec
);
const
DVprofile
*
sys
=
avpriv_dv_codec_profile
(
c
->
vst
->
codec
);
int64_t
offset
;
int64_t
size
=
avio_size
(
s
->
pb
)
-
s
->
data_offset
;
int64_t
max_offset
=
((
size
-
1
)
/
sys
->
frame_size
)
*
sys
->
frame_size
;
int64_t
size
=
avio_size
(
s
->
pb
)
-
s
->
data_offset
;
int64_t
max_offset
=
((
size
-
1
)
/
sys
->
frame_size
)
*
sys
->
frame_size
;
offset
=
sys
->
frame_size
*
timestamp
;
if
(
size
>=
0
&&
offset
>
max_offset
)
offset
=
max_offset
;
else
if
(
offset
<
0
)
offset
=
0
;
if
(
size
>=
0
&&
offset
>
max_offset
)
offset
=
max_offset
;
else
if
(
offset
<
0
)
offset
=
0
;
return
offset
+
s
->
data_offset
;
}
void
ff_dv_offset_reset
(
DVDemuxContext
*
c
,
int64_t
frame_offset
)
{
c
->
frames
=
frame_offset
;
c
->
frames
=
frame_offset
;
if
(
c
->
ach
)
c
->
abytes
=
av_rescale_q
(
c
->
frames
,
c
->
sys
->
time_base
,
(
AVRational
){
8
,
c
->
ast
[
0
]
->
codec
->
bit_rate
});
c
->
abytes
=
av_rescale_q
(
c
->
frames
,
c
->
sys
->
time_base
,
(
AVRational
)
{
8
,
c
->
ast
[
0
]
->
codec
->
bit_rate
});
c
->
audio_pkt
[
0
].
size
=
c
->
audio_pkt
[
1
].
size
=
0
;
c
->
audio_pkt
[
2
].
size
=
c
->
audio_pkt
[
3
].
size
=
0
;
}
...
...
@@ -414,7 +426,7 @@ void ff_dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
************************************************************/
typedef
struct
RawDVContext
{
DVDemuxContext
*
dv_demux
;
DVDemuxContext
*
dv_demux
;
uint8_t
buf
[
DV_MAX_FRAME_SIZE
];
}
RawDVContext
;
...
...
@@ -448,19 +460,22 @@ static int dv_read_header(AVFormatContext *s)
avio_seek
(
s
->
pb
,
-
DV_PROFILE_BYTES
,
SEEK_CUR
)
<
0
)
return
AVERROR
(
EIO
);
c
->
dv_demux
->
sys
=
avpriv_dv_frame_profile
(
c
->
dv_demux
->
sys
,
c
->
buf
,
DV_PROFILE_BYTES
);
c
->
dv_demux
->
sys
=
avpriv_dv_frame_profile
(
c
->
dv_demux
->
sys
,
c
->
buf
,
DV_PROFILE_BYTES
);
if
(
!
c
->
dv_demux
->
sys
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"Can't determine profile of DV input stream.
\n
"
);
av_log
(
s
,
AV_LOG_ERROR
,
"Can't determine profile of DV input stream.
\n
"
);
return
-
1
;
}
s
->
bit_rate
=
av_rescale_q
(
c
->
dv_demux
->
sys
->
frame_size
,
(
AVRational
){
8
,
1
},
s
->
bit_rate
=
av_rescale_q
(
c
->
dv_demux
->
sys
->
frame_size
,
(
AVRational
)
{
8
,
1
},
c
->
dv_demux
->
sys
->
time_base
);
return
0
;
}
static
int
dv_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
int
size
;
...
...
@@ -482,7 +497,7 @@ static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
}
static
int
dv_read_seek
(
AVFormatContext
*
s
,
int
stream_index
,
int64_t
timestamp
,
int
flags
)
int64_t
timestamp
,
int
flags
)
{
RawDVContext
*
r
=
s
->
priv_data
;
DVDemuxContext
*
c
=
r
->
dv_demux
;
...
...
@@ -506,7 +521,7 @@ static int dv_probe(AVProbeData *p)
{
unsigned
state
,
marker_pos
=
0
;
int
i
;
int
matches
=
0
;
int
matches
=
0
;
int
secondary_matches
=
0
;
if
(
p
->
buf_size
<
5
)
...
...
@@ -527,10 +542,13 @@ static int dv_probe(AVProbeData *p)
state
=
(
state
<<
8
)
|
p
->
buf
[
i
];
}
if
(
matches
&&
p
->
buf_size
/
matches
<
1024
*
1024
)
{
if
(
matches
>
4
||
(
secondary_matches
>=
10
&&
p
->
buf_size
/
secondary_matches
<
24000
))
return
AVPROBE_SCORE_MAX
*
3
/
4
;
// not max to avoid dv in mov to match
return
AVPROBE_SCORE_MAX
/
4
;
if
(
matches
&&
p
->
buf_size
/
matches
<
1024
*
1024
)
{
if
(
matches
>
4
||
(
secondary_matches
>=
10
&&
p
->
buf_size
/
secondary_matches
<
24000
))
// not max to avoid dv in mov to match
return
AVPROBE_SCORE_MAX
*
3
/
4
;
return
AVPROBE_SCORE_MAX
/
4
;
}
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