Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
76 additions
and
58 deletions
+76
-58
dv.c
libavformat/dv.c
+76
-58
No files found.
libavformat/dv.c
View file @
fcc455ff
...
...
@@ -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,12 +108,12 @@ 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
);
...
...
@@ -121,7 +121,7 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
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 */
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
)
...
...
@@ -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
);
((
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
]
+
/* 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
;
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
]
=
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
);
...
...
@@ -208,8 +217,8 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
}
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 */
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
))
{
...
...
@@ -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
;
...
...
@@ -253,13 +262,13 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
}
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,8 +277,8 @@ 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
->
time_base
=
c
->
sys
->
time_base
;
if
(
!
avctx
->
width
)
{
avctx
->
width
=
c
->
sys
->
width
;
avctx
->
height
=
c
->
sys
->
height
;
}
...
...
@@ -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
;
...
...
@@ -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
)
...
...
@@ -386,25 +395,28 @@ static int64_t dv_frame_offset(AVFormatContext *s, DVDemuxContext *c,
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
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
;
...
...
@@ -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