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
f94036f1
Commit
f94036f1
authored
Oct 24, 2008
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
prettyprinting cosmetics
Originally committed as revision 15682 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
75f2c209
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
389 additions
and
378 deletions
+389
-378
dv.c
libavcodec/dv.c
+233
-226
dvdata.h
libavcodec/dvdata.h
+75
-72
dv.c
libavformat/dv.c
+60
-59
dvenc.c
libavformat/dvenc.c
+21
-21
No files found.
libavcodec/dv.c
View file @
f94036f1
...
...
@@ -48,7 +48,7 @@
//#include <assert.h>
typedef
struct
DVVideoContext
{
const
DVprofile
*
sys
;
const
DVprofile
*
sys
;
AVFrame
picture
;
AVCodecContext
*
avctx
;
uint8_t
*
buf
;
...
...
@@ -94,29 +94,29 @@ static void dv_build_unquantize_tables(DVVideoContext *s, uint8_t* perm)
int
i
,
q
,
a
;
/* NOTE: max left shift is 6 */
for
(
q
=
0
;
q
<
22
;
q
++
)
{
for
(
q
=
0
;
q
<
22
;
q
++
)
{
/* 88DCT */
i
=
1
;
for
(
a
=
0
;
a
<
4
;
a
++
)
{
for
(;
i
<
dv_quant_areas
[
a
];
i
++
)
{
i
=
1
;
for
(
a
=
0
;
a
<
4
;
a
++
)
{
for
(;
i
<
dv_quant_areas
[
a
];
i
++
)
{
/* 88 table */
s
->
dv_idct_factor
[
0
][
0
][
q
][
i
]
=
dv_iweight_88
[
i
]
<<
(
dv_quant_shifts
[
q
][
a
]
+
1
);
s
->
dv_idct_factor
[
1
][
0
][
q
][
i
]
=
s
->
dv_idct_factor
[
0
][
0
][
q
][
i
]
<<
1
;
s
->
dv_idct_factor
[
0
][
0
][
q
][
i
]
=
dv_iweight_88
[
i
]
<<
(
dv_quant_shifts
[
q
][
a
]
+
1
);
s
->
dv_idct_factor
[
1
][
0
][
q
][
i
]
=
s
->
dv_idct_factor
[
0
][
0
][
q
][
i
]
<<
1
;
/* 248 table */
s
->
dv_idct_factor
[
0
][
1
][
q
][
i
]
=
dv_iweight_248
[
i
]
<<
(
dv_quant_shifts
[
q
][
a
]
+
1
);
s
->
dv_idct_factor
[
1
][
1
][
q
][
i
]
=
s
->
dv_idct_factor
[
0
][
1
][
q
][
i
]
<<
1
;
s
->
dv_idct_factor
[
0
][
1
][
q
][
i
]
=
dv_iweight_248
[
i
]
<<
(
dv_quant_shifts
[
q
][
a
]
+
1
);
s
->
dv_idct_factor
[
1
][
1
][
q
][
i
]
=
s
->
dv_idct_factor
[
0
][
1
][
q
][
i
]
<<
1
;
}
}
}
for
(
a
=
0
;
a
<
4
;
a
++
)
{
for
(
q
=
0
;
q
<
16
;
q
++
)
{
for
(
i
=
1
;
i
<
64
;
i
++
)
{
s
->
dv100_idct_factor
[
0
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_1080_y
[
i
];
s
->
dv100_idct_factor
[
1
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_1080_c
[
i
];
s
->
dv100_idct_factor
[
2
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_720_y
[
i
];
s
->
dv100_idct_factor
[
3
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_720_c
[
i
];
for
(
a
=
0
;
a
<
4
;
a
++
)
{
for
(
q
=
0
;
q
<
16
;
q
++
)
{
for
(
i
=
1
;
i
<
64
;
i
++
)
{
s
->
dv100_idct_factor
[
0
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_1080_y
[
i
];
s
->
dv100_idct_factor
[
1
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_1080_c
[
i
];
s
->
dv100_idct_factor
[
2
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_720_y
[
i
];
s
->
dv100_idct_factor
[
3
][
a
][
q
][
i
]
=
(
dv100_qstep
[
q
]
<<
(
a
+
9
))
*
dv_iweight_720_c
[
i
];
}
}
}
...
...
@@ -126,7 +126,7 @@ static av_cold int dvvideo_init(AVCodecContext *avctx)
{
DVVideoContext
*
s
=
avctx
->
priv_data
;
DSPContext
dsp
;
static
int
done
=
0
;
static
int
done
=
0
;
int
i
,
j
;
if
(
!
done
)
{
...
...
@@ -139,11 +139,11 @@ static av_cold int dvvideo_init(AVCodecContext *avctx)
done
=
1
;
/* dv_anchor lets each thread know its ID */
for
(
i
=
0
;
i
<
DV_ANCHOR_SIZE
;
i
++
)
for
(
i
=
0
;
i
<
DV_ANCHOR_SIZE
;
i
++
)
dv_anchor
[
i
]
=
(
void
*
)(
size_t
)
i
;
/* it's faster to include sign bit in a generic VLC parsing scheme */
for
(
i
=
0
,
j
=
0
;
i
<
NB_DV_VLC
;
i
++
,
j
++
)
{
for
(
i
=
0
,
j
=
0
;
i
<
NB_DV_VLC
;
i
++
,
j
++
)
{
new_dv_vlc_bits
[
j
]
=
dv_vlc_bits
[
i
];
new_dv_vlc_len
[
j
]
=
dv_vlc_len
[
i
];
new_dv_vlc_run
[
j
]
=
dv_vlc_run
[
i
];
...
...
@@ -167,17 +167,17 @@ static av_cold int dvvideo_init(AVCodecContext *avctx)
new_dv_vlc_len
,
1
,
1
,
new_dv_vlc_bits
,
2
,
2
,
0
);
assert
(
dv_vlc
.
table_size
==
1184
);
for
(
i
=
0
;
i
<
dv_vlc
.
table_size
;
i
++
){
int
code
=
dv_vlc
.
table
[
i
][
0
];
for
(
i
=
0
;
i
<
dv_vlc
.
table_size
;
i
++
){
int
code
=
dv_vlc
.
table
[
i
][
0
];
int
len
=
dv_vlc
.
table
[
i
][
1
];
int
level
,
run
;
if
(
len
<
0
){
//more bits needed
run
=
0
;
level
=
code
;
if
(
len
<
0
){
//more bits needed
run
=
0
;
level
=
code
;
}
else
{
run
=
new_dv_vlc_run
[
code
]
+
1
;
level
=
new_dv_vlc_level
[
code
];
run
=
new_dv_vlc_run
[
code
]
+
1
;
level
=
new_dv_vlc_level
[
code
];
}
dv_rl_vlc
[
i
].
len
=
len
;
dv_rl_vlc
[
i
].
level
=
level
;
...
...
@@ -196,10 +196,10 @@ static av_cold int dvvideo_init(AVCodecContext *avctx)
if
(
dv_vlc_map
[
dv_vlc_run
[
i
]][
dv_vlc_level
[
i
]].
size
!=
0
)
continue
;
dv_vlc_map
[
dv_vlc_run
[
i
]][
dv_vlc_level
[
i
]].
vlc
=
dv_vlc_bits
[
i
]
<<
(
!!
dv_vlc_level
[
i
]);
dv_vlc_map
[
dv_vlc_run
[
i
]][
dv_vlc_level
[
i
]].
size
=
dv_vlc_len
[
i
]
+
(
!!
dv_vlc_level
[
i
]);
dv_vlc_map
[
dv_vlc_run
[
i
]][
dv_vlc_level
[
i
]].
vlc
=
dv_vlc_bits
[
i
]
<<
(
!!
dv_vlc_level
[
i
]);
dv_vlc_map
[
dv_vlc_run
[
i
]][
dv_vlc_level
[
i
]].
size
=
dv_vlc_len
[
i
]
+
(
!!
dv_vlc_level
[
i
]);
}
for
(
i
=
0
;
i
<
DV_VLC_MAP_RUN_SIZE
;
i
++
)
{
#ifdef DV_CODEC_TINY_TARGET
...
...
@@ -235,16 +235,16 @@ static av_cold int dvvideo_init(AVCodecContext *avctx)
/* 88DCT setup */
s
->
fdct
[
0
]
=
dsp
.
fdct
;
s
->
idct_put
[
0
]
=
dsp
.
idct_put
;
for
(
i
=
0
;
i
<
64
;
i
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
s
->
dv_zigzag
[
0
][
i
]
=
dsp
.
idct_permutation
[
ff_zigzag_direct
[
i
]];
/* 248DCT setup */
s
->
fdct
[
1
]
=
dsp
.
fdct248
;
s
->
idct_put
[
1
]
=
ff_simple_idct248_put
;
// FIXME: need to add it to DSP
if
(
avctx
->
lowres
){
for
(
i
=
0
;
i
<
64
;
i
++
){
int
j
=
ff_zigzag248_direct
[
i
];
s
->
dv_zigzag
[
1
][
i
]
=
dsp
.
idct_permutation
[(
j
&
7
)
+
(
j
&
8
)
*
4
+
(
j
&
48
)
/
2
];
if
(
avctx
->
lowres
){
for
(
i
=
0
;
i
<
64
;
i
++
){
int
j
=
ff_zigzag248_direct
[
i
];
s
->
dv_zigzag
[
1
][
i
]
=
dsp
.
idct_permutation
[(
j
&
7
)
+
(
j
&
8
)
*
4
+
(
j
&
48
)
/
2
];
}
}
else
memcpy
(
s
->
dv_zigzag
[
1
],
ff_zigzag248_direct
,
64
);
...
...
@@ -253,7 +253,7 @@ static av_cold int dvvideo_init(AVCodecContext *avctx)
dv_build_unquantize_tables
(
s
,
dsp
.
idct_permutation
);
avctx
->
coded_frame
=
&
s
->
picture
;
s
->
avctx
=
avctx
;
s
->
avctx
=
avctx
;
return
0
;
}
...
...
@@ -302,13 +302,13 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
/* if we must parse a partial vlc, we do it here */
if
(
partial_bit_count
>
0
)
{
re_cache
=
((
unsigned
)
re_cache
>>
partial_bit_count
)
|
(
mb
->
partial_bit_buffer
<<
(
sizeof
(
re_cache
)
*
8
-
partial_bit_count
));
(
mb
->
partial_bit_buffer
<<
(
sizeof
(
re_cache
)
*
8
-
partial_bit_count
));
re_index
-=
partial_bit_count
;
mb
->
partial_bit_count
=
0
;
}
/* get the AC coefficients until last_index is reached */
for
(;;)
{
for
(;;)
{
#ifdef VLC_DEBUG
printf
(
"%2d: bits=%04x index=%d
\n
"
,
pos
,
SHOW_UBITS
(
re
,
gb
,
16
),
re_index
);
#endif
...
...
@@ -339,7 +339,7 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
if
(
pos
>=
64
)
break
;
level
=
(
level
*
factor_table
[
pos
]
+
(
1
<<
(
dv_iweight_bits
-
1
)))
>>
dv_iweight_bits
;
level
=
(
level
*
factor_table
[
pos
]
+
(
1
<<
(
dv_iweight_bits
-
1
)))
>>
dv_iweight_bits
;
block
[
scan_table
[
pos
]]
=
level
;
UPDATE_CACHE
(
re
,
gb
);
...
...
@@ -378,11 +378,11 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
DECLARE_ALIGNED_16
(
DCTELEM
,
sblock
[
5
*
DV_MAX_BPM
][
64
]);
DECLARE_ALIGNED_8
(
uint8_t
,
mb_bit_buffer
[
80
+
4
]);
/* allow some slack */
DECLARE_ALIGNED_8
(
uint8_t
,
vs_bit_buffer
[
5
*
80
+
4
]);
/* allow some slack */
const
int
log2_blocksize
=
3
-
s
->
avctx
->
lowres
;
const
int
log2_blocksize
=
3
-
s
->
avctx
->
lowres
;
int
is_field_mode
[
5
];
assert
((((
int
)
mb_bit_buffer
)
&
7
)
==
0
);
assert
((((
int
)
vs_bit_buffer
)
&
7
)
==
0
);
assert
((((
int
)
mb_bit_buffer
)
&
7
)
==
0
);
assert
((((
int
)
vs_bit_buffer
)
&
7
)
==
0
);
memset
(
sblock
,
0
,
sizeof
(
sblock
));
...
...
@@ -391,7 +391,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
block1
=
&
sblock
[
0
][
0
];
mb1
=
mb_data
;
init_put_bits
(
&
vs_pb
,
vs_bit_buffer
,
5
*
80
);
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
,
mb1
+=
s
->
sys
->
bpm
,
block1
+=
s
->
sys
->
bpm
*
64
)
{
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
,
mb1
+=
s
->
sys
->
bpm
,
block1
+=
s
->
sys
->
bpm
*
64
)
{
/* skip header */
quant
=
buf_ptr
[
3
]
&
0x0f
;
buf_ptr
+=
4
;
...
...
@@ -399,7 +399,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
mb
=
mb1
;
block
=
block1
;
is_field_mode
[
mb_index
]
=
0
;
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
)
{
last_index
=
s
->
sys
->
block_sizes
[
j
];
init_get_bits
(
&
gb
,
buf_ptr
,
last_index
);
...
...
@@ -410,10 +410,10 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
if
(
DV_PROFILE_IS_HD
(
s
->
sys
))
{
mb
->
idct_put
=
s
->
idct_put
[
0
];
mb
->
scan_table
=
s
->
dv_zigzag
[
0
];
mb
->
factor_table
=
s
->
dv100_idct_factor
[((
s
->
sys
->
height
==
720
)
<<
1
)
|
(
j
>=
4
)][
class1
][
quant
];
mb
->
factor_table
=
s
->
dv100_idct_factor
[((
s
->
sys
->
height
==
720
)
<<
1
)
|
(
j
>=
4
)][
class1
][
quant
];
is_field_mode
[
mb_index
]
|=
!
j
&&
dct_mode
;
}
else
{
mb
->
idct_put
=
s
->
idct_put
[
dct_mode
&&
log2_blocksize
==
3
];
mb
->
idct_put
=
s
->
idct_put
[
dct_mode
&&
log2_blocksize
==
3
];
mb
->
scan_table
=
s
->
dv_zigzag
[
dct_mode
];
mb
->
factor_table
=
s
->
dv_idct_factor
[
class1
==
3
][
dct_mode
]
[
quant
+
dv_quant_offset
[
class1
]];
...
...
@@ -449,7 +449,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
mb
=
mb1
;
init_get_bits
(
&
gb
,
mb_bit_buffer
,
put_bits_count
(
&
pb
));
flush_put_bits
(
&
pb
);
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
,
block
+=
64
,
mb
++
)
{
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
,
block
+=
64
,
mb
++
)
{
if
(
mb
->
pos
<
64
&&
get_bits_left
(
&
gb
)
>
0
)
{
dv_decode_ac
(
&
gb
,
mb
,
block
);
/* if still not finished, no need to parse other blocks */
...
...
@@ -471,8 +471,8 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
mb
=
mb_data
;
init_get_bits
(
&
gb
,
vs_bit_buffer
,
put_bits_count
(
&
vs_pb
));
flush_put_bits
(
&
vs_pb
);
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
)
{
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
for
(
j
=
0
;
j
<
s
->
sys
->
bpm
;
j
++
)
{
if
(
mb
->
pos
<
64
)
{
#ifdef VLC_DEBUG
printf
(
"start %d:%d
\n
"
,
mb_index
,
j
);
...
...
@@ -489,40 +489,40 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
/* compute idct and place blocks */
block
=
&
sblock
[
0
][
0
];
mb
=
mb_data
;
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
v
=
*
mb_pos_ptr
++
;
mb_x
=
v
&
0xff
;
mb_y
=
v
>>
8
;
/* We work with 720p frames split in half. The odd half-frame (chan==2,3) is displaced :-( */
if
(
s
->
sys
->
height
==
720
&&
!
(
s
->
buf
[
1
]
&
0x0C
))
{
mb_y
-=
(
mb_y
>
17
)
?
18
:
-
72
;
/* shifting the Y coordinate down by 72/2 macroblocks */
if
(
s
->
sys
->
height
==
720
&&
!
(
s
->
buf
[
1
]
&
0x0C
))
{
mb_y
-=
(
mb_y
>
17
)
?
18
:
-
72
;
/* shifting the Y coordinate down by 72/2 macroblocks */
}
/* idct_put'ting luminance */
if
((
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV420P
)
||
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
||
(
s
->
sys
->
height
>=
720
&&
mb_y
!=
134
))
{
y_stride
=
(
s
->
picture
.
linesize
[
0
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
));
y_stride
=
(
s
->
picture
.
linesize
[
0
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
));
}
else
{
y_stride
=
(
2
<<
log2_blocksize
);
y_stride
=
(
2
<<
log2_blocksize
);
}
y_ptr
=
s
->
picture
.
data
[
0
]
+
((
mb_y
*
s
->
picture
.
linesize
[
0
]
+
mb_x
)
<<
log2_blocksize
);
linesize
=
s
->
picture
.
linesize
[
0
]
<<
is_field_mode
[
mb_index
];
y_ptr
=
s
->
picture
.
data
[
0
]
+
((
mb_y
*
s
->
picture
.
linesize
[
0
]
+
mb_x
)
<<
log2_blocksize
);
linesize
=
s
->
picture
.
linesize
[
0
]
<<
is_field_mode
[
mb_index
];
mb
[
0
]
.
idct_put
(
y_ptr
,
linesize
,
block
+
0
*
64
);
if
(
s
->
sys
->
video_stype
==
4
)
{
/* SD 422 */
mb
[
2
].
idct_put
(
y_ptr
+
(
1
<<
log2_blocksize
)
,
linesize
,
block
+
2
*
64
);
mb
[
2
].
idct_put
(
y_ptr
+
(
1
<<
log2_blocksize
)
,
linesize
,
block
+
2
*
64
);
}
else
{
mb
[
1
].
idct_put
(
y_ptr
+
(
1
<<
log2_blocksize
)
,
linesize
,
block
+
1
*
64
);
mb
[
1
].
idct_put
(
y_ptr
+
(
1
<<
log2_blocksize
)
,
linesize
,
block
+
1
*
64
);
mb
[
2
].
idct_put
(
y_ptr
+
y_stride
,
linesize
,
block
+
2
*
64
);
mb
[
3
].
idct_put
(
y_ptr
+
(
1
<<
log2_blocksize
)
+
y_stride
,
linesize
,
block
+
3
*
64
);
mb
[
3
].
idct_put
(
y_ptr
+
(
1
<<
log2_blocksize
)
+
y_stride
,
linesize
,
block
+
3
*
64
);
}
mb
+=
4
;
block
+=
4
*
64
;
/* idct_put'ting chrominance */
c_offset
=
(((
mb_y
>>
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV420P
))
*
s
->
picture
.
linesize
[
1
]
+
(
mb_x
>>
((
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
)
?
2
:
1
)))
<<
log2_blocksize
);
for
(
j
=
2
;
j
;
j
--
)
{
c_offset
=
(((
mb_y
>>
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV420P
))
*
s
->
picture
.
linesize
[
1
]
+
(
mb_x
>>
((
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
)
?
2
:
1
)))
<<
log2_blocksize
);
for
(
j
=
2
;
j
;
j
--
)
{
uint8_t
*
c_ptr
=
s
->
picture
.
data
[
j
]
+
c_offset
;
if
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
{
uint64_t
aligned_pixels
[
64
/
8
];
...
...
@@ -530,22 +530,22 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
uint8_t
*
c_ptr1
,
*
ptr1
;
int
x
,
y
;
mb
->
idct_put
(
pixels
,
8
,
block
);
for
(
y
=
0
;
y
<
(
1
<<
log2_blocksize
);
y
++
,
c_ptr
+=
s
->
picture
.
linesize
[
j
],
pixels
+=
8
)
{
ptr1
=
pixels
+
(
1
<<
(
log2_blocksize
-
1
));
c_ptr1
=
c_ptr
+
(
s
->
picture
.
linesize
[
j
]
<<
log2_blocksize
);
for
(
x
=
0
;
x
<
(
1
<<
(
log2_blocksize
-
1
));
x
++
)
{
c_ptr
[
x
]
=
pixels
[
x
];
c_ptr1
[
x
]
=
ptr1
[
x
];
for
(
y
=
0
;
y
<
(
1
<<
log2_blocksize
);
y
++
,
c_ptr
+=
s
->
picture
.
linesize
[
j
],
pixels
+=
8
)
{
ptr1
=
pixels
+
(
1
<<
(
log2_blocksize
-
1
));
c_ptr1
=
c_ptr
+
(
s
->
picture
.
linesize
[
j
]
<<
log2_blocksize
);
for
(
x
=
0
;
x
<
(
1
<<
(
log2_blocksize
-
1
));
x
++
)
{
c_ptr
[
x
]
=
pixels
[
x
];
c_ptr1
[
x
]
=
ptr1
[
x
];
}
}
block
+=
64
;
mb
++
;
}
else
{
y_stride
=
(
mb_y
==
134
)
?
(
1
<<
log2_blocksize
)
:
s
->
picture
.
linesize
[
j
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
);
linesize
=
s
->
picture
.
linesize
[
j
]
<<
is_field_mode
[
mb_index
];
(
mb
++
)
->
idct_put
(
c_ptr
,
linesize
,
block
);
block
+=
64
;
y_stride
=
(
mb_y
==
134
)
?
(
1
<<
log2_blocksize
)
:
s
->
picture
.
linesize
[
j
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
);
linesize
=
s
->
picture
.
linesize
[
j
]
<<
is_field_mode
[
mb_index
];
(
mb
++
)
->
idct_put
(
c_ptr
,
linesize
,
block
);
block
+=
64
;
if
(
s
->
sys
->
bpm
==
8
)
{
(
mb
++
)
->
idct_put
(
c_ptr
+
y_stride
,
linesize
,
block
);
block
+=
64
;
(
mb
++
)
->
idct_put
(
c_ptr
+
y_stride
,
linesize
,
block
);
block
+=
64
;
}
}
}
...
...
@@ -621,23 +621,23 @@ typedef struct EncBlockInfo {
uint32_t
partial_bit_buffer
;
/* we can't use uint16_t here */
}
EncBlockInfo
;
static
av_always_inline
PutBitContext
*
dv_encode_ac
(
EncBlockInfo
*
bi
,
PutBitContext
*
pb_pool
,
static
av_always_inline
PutBitContext
*
dv_encode_ac
(
EncBlockInfo
*
bi
,
PutBitContext
*
pb_pool
,
PutBitContext
*
pb_end
)
{
int
prev
;
int
bits_left
;
int
prev
,
bits_left
;
PutBitContext
*
pb
=
pb_pool
;
int
size
=
bi
->
partial_bit_count
;
uint32_t
vlc
=
bi
->
partial_bit_buffer
;
bi
->
partial_bit_count
=
bi
->
partial_bit_buffer
=
0
;
for
(;;){
for
(;;){
/* Find suitable storage space */
for
(;
size
>
(
bits_left
=
put_bits_left
(
pb
));
pb
++
)
{
if
(
bits_left
)
{
size
-=
bits_left
;
put_bits
(
pb
,
bits_left
,
vlc
>>
size
);
vlc
=
vlc
&
((
1
<<
size
)
-
1
);
vlc
=
vlc
&
((
1
<<
size
)
-
1
);
}
if
(
pb
+
1
>=
pb_end
)
{
bi
->
partial_bit_count
=
size
;
...
...
@@ -649,13 +649,13 @@ static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitCont
/* Store VLC */
put_bits
(
pb
,
size
,
vlc
);
if
(
bi
->
cur_ac
>=
64
)
if
(
bi
->
cur_ac
>=
64
)
break
;
/* Construct the next VLC */
prev
=
bi
->
cur_ac
;
prev
=
bi
->
cur_ac
;
bi
->
cur_ac
=
bi
->
next
[
prev
];
if
(
bi
->
cur_ac
<
64
){
if
(
bi
->
cur_ac
<
64
){
size
=
dv_rl2vlc
(
bi
->
cur_ac
-
prev
-
1
,
bi
->
mb
[
bi
->
cur_ac
],
bi
->
sign
[
bi
->
cur_ac
],
&
vlc
);
}
else
{
size
=
4
;
vlc
=
6
;
/* End Of Block stamp */
...
...
@@ -665,7 +665,8 @@ static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitCont
}
static
av_always_inline
void
dv_set_class_number
(
DCTELEM
*
blk
,
EncBlockInfo
*
bi
,
const
uint8_t
*
zigzag_scan
,
const
int
*
weight
,
int
bias
)
const
uint8_t
*
zigzag_scan
,
const
int
*
weight
,
int
bias
)
{
int
i
,
area
;
/* We offer two different methods for class number assignment: the
...
...
@@ -683,50 +684,51 @@ static av_always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi,
#else
/* improved FFmpeg method */
static
const
int
classes
[]
=
{
-
1
,
-
1
,
255
,
0xffff
};
#endif
int
max
=
classes
[
0
];
int
prev
=
0
;
int
max
=
classes
[
0
];
int
prev
=
0
;
bi
->
mb
[
0
]
=
blk
[
0
];
for
(
area
=
0
;
area
<
4
;
area
++
)
{
bi
->
prev
[
area
]
=
prev
;
bi
->
bit_size
[
area
]
=
1
;
// 4 areas 4 bits for EOB :)
for
(
i
=
mb_area_start
[
area
];
i
<
mb_area_start
[
area
+
1
];
i
++
)
{
for
(
i
=
mb_area_start
[
area
];
i
<
mb_area_start
[
area
+
1
];
i
++
)
{
int
level
=
blk
[
zigzag_scan
[
i
]];
if
(
level
+
15
>
30U
)
{
bi
->
sign
[
i
]
=
(
level
>>
31
)
&
1
;
if
(
level
+
15
>
30U
)
{
bi
->
sign
[
i
]
=
(
level
>>
31
)
&
1
;
/* weigh it and and shift down into range, adding for rounding */
/* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
AND the 2x doubling of the weights */
level
=
(
FFABS
(
level
)
*
weight
[
i
]
+
(
1
<<
(
dv_weight_bits
+
3
)))
>>
(
dv_weight_bits
+
4
);
level
=
(
FFABS
(
level
)
*
weight
[
i
]
+
(
1
<<
(
dv_weight_bits
+
3
)))
>>
(
dv_weight_bits
+
4
);
bi
->
mb
[
i
]
=
level
;
if
(
level
>
max
)
max
=
level
;
if
(
level
>
max
)
max
=
level
;
bi
->
bit_size
[
area
]
+=
dv_rl2vlc_size
(
i
-
prev
-
1
,
level
);
bi
->
next
[
prev
]
=
i
;
prev
=
i
;
prev
=
i
;
}
}
}
bi
->
next
[
prev
]
=
i
;
for
(
bi
->
cno
=
0
;
max
>
classes
[
bi
->
cno
];
bi
->
cno
++
);
for
(
bi
->
cno
=
0
;
max
>
classes
[
bi
->
cno
];
bi
->
cno
++
);
bi
->
cno
+=
bias
;
if
(
bi
->
cno
>=
3
)
{
bi
->
cno
=
3
;
prev
=
0
;
i
=
bi
->
next
[
prev
];
prev
=
0
;
i
=
bi
->
next
[
prev
];
for
(
area
=
0
;
area
<
4
;
area
++
)
{
bi
->
prev
[
area
]
=
prev
;
bi
->
bit_size
[
area
]
=
1
;
// 4 areas 4 bits for EOB :)
for
(;
i
<
mb_area_start
[
area
+
1
];
i
=
bi
->
next
[
i
])
{
bi
->
mb
[
i
]
>>=
1
;
for
(;
i
<
mb_area_start
[
area
+
1
];
i
=
bi
->
next
[
i
])
{
bi
->
mb
[
i
]
>>=
1
;
if
(
bi
->
mb
[
i
])
{
bi
->
bit_size
[
area
]
+=
dv_rl2vlc_size
(
i
-
prev
-
1
,
bi
->
mb
[
i
]);
bi
->
next
[
prev
]
=
i
;
prev
=
i
;
prev
=
i
;
}
}
}
...
...
@@ -744,14 +746,14 @@ static av_always_inline int dv_guess_dct_mode(DCTELEM *blk) {
/* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
s
=
blk
;
for
(
i
=
0
;
i
<
7
;
i
++
)
{
for
(
i
=
0
;
i
<
7
;
i
++
)
{
score88
+=
SC
(
0
,
8
)
+
SC
(
1
,
9
)
+
SC
(
2
,
10
)
+
SC
(
3
,
11
)
+
SC
(
4
,
12
)
+
SC
(
5
,
13
)
+
SC
(
6
,
14
)
+
SC
(
7
,
15
);
s
+=
8
;
}
/* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
s
=
blk
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
score248
+=
SC
(
0
,
16
)
+
SC
(
1
,
17
)
+
SC
(
2
,
18
)
+
SC
(
3
,
19
)
+
SC
(
4
,
20
)
+
SC
(
5
,
21
)
+
SC
(
6
,
22
)
+
SC
(
7
,
23
);
s
+=
8
;
...
...
@@ -766,36 +768,36 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
int
i
,
j
,
k
,
a
,
prev
,
a2
;
EncBlockInfo
*
b
;
size
[
0
]
=
size
[
1
]
=
size
[
2
]
=
size
[
3
]
=
size
[
4
]
=
1
<<
24
;
size
[
0
]
=
size
[
1
]
=
size
[
2
]
=
size
[
3
]
=
size
[
4
]
=
1
<<
24
;
do
{
b
=
blks
;
for
(
i
=
0
;
i
<
5
;
i
++
)
{
for
(
i
=
0
;
i
<
5
;
i
++
)
{
if
(
!
qnos
[
i
])
continue
;
qnos
[
i
]
--
;
size
[
i
]
=
0
;
for
(
j
=
0
;
j
<
6
;
j
++
,
b
++
)
{
for
(
a
=
0
;
a
<
4
;
a
++
)
{
for
(
j
=
0
;
j
<
6
;
j
++
,
b
++
)
{
for
(
a
=
0
;
a
<
4
;
a
++
)
{
if
(
b
->
area_q
[
a
]
!=
dv_quant_shifts
[
qnos
[
i
]
+
dv_quant_offset
[
b
->
cno
]][
a
])
{
b
->
bit_size
[
a
]
=
1
;
// 4 areas 4 bits for EOB :)
b
->
area_q
[
a
]
++
;
prev
=
b
->
prev
[
a
];
prev
=
b
->
prev
[
a
];
assert
(
b
->
next
[
prev
]
>=
mb_area_start
[
a
+
1
]
||
b
->
mb
[
prev
]);
for
(
k
=
b
->
next
[
prev
]
;
k
<
mb_area_start
[
a
+
1
];
k
=
b
->
next
[
k
])
{
for
(
k
=
b
->
next
[
prev
]
;
k
<
mb_area_start
[
a
+
1
];
k
=
b
->
next
[
k
])
{
b
->
mb
[
k
]
>>=
1
;
if
(
b
->
mb
[
k
])
{
b
->
bit_size
[
a
]
+=
dv_rl2vlc_size
(
k
-
prev
-
1
,
b
->
mb
[
k
]);
prev
=
k
;
prev
=
k
;
}
else
{
if
(
b
->
next
[
k
]
>=
mb_area_start
[
a
+
1
]
&&
b
->
next
[
k
]
<
64
){
for
(
a2
=
a
+
1
;
b
->
next
[
k
]
>=
mb_area_start
[
a2
+
1
];
a2
++
)
if
(
b
->
next
[
k
]
>=
mb_area_start
[
a
+
1
]
&&
b
->
next
[
k
]
<
64
){
for
(
a2
=
a
+
1
;
b
->
next
[
k
]
>=
mb_area_start
[
a2
+
1
];
a2
++
)
b
->
prev
[
a2
]
=
prev
;
assert
(
a2
<
4
);
assert
(
a2
<
4
);
assert
(
b
->
mb
[
b
->
next
[
k
]]);
b
->
bit_size
[
a2
]
+=
dv_rl2vlc_size
(
b
->
next
[
k
]
-
prev
-
1
,
b
->
mb
[
b
->
next
[
k
]])
-
dv_rl2vlc_size
(
b
->
next
[
k
]
-
k
-
1
,
b
->
mb
[
b
->
next
[
k
]]);
assert
(
b
->
prev
[
a2
]
==
k
&&
(
a2
+
1
>=
4
||
b
->
prev
[
a2
+
1
]
!=
k
));
assert
(
b
->
prev
[
a2
]
==
k
&&
(
a2
+
1
>=
4
||
b
->
prev
[
a2
+
1
]
!=
k
));
b
->
prev
[
a2
]
=
prev
;
}
b
->
next
[
prev
]
=
b
->
next
[
k
];
...
...
@@ -806,23 +808,23 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
size
[
i
]
+=
b
->
bit_size
[
a
];
}
}
if
(
vs_total_ac_bits
>=
size
[
0
]
+
size
[
1
]
+
size
[
2
]
+
size
[
3
]
+
size
[
4
])
if
(
vs_total_ac_bits
>=
size
[
0
]
+
size
[
1
]
+
size
[
2
]
+
size
[
3
]
+
size
[
4
])
return
;
}
}
while
(
qnos
[
0
]
|
qnos
[
1
]
|
qnos
[
2
]
|
qnos
[
3
]
|
qnos
[
4
]);
for
(
a
=
2
;
a
==
2
||
vs_total_ac_bits
<
size
[
0
];
a
+=
a
){
for
(
a
=
2
;
a
==
2
||
vs_total_ac_bits
<
size
[
0
];
a
+=
a
){
b
=
blks
;
size
[
0
]
=
5
*
6
*
4
;
//EOB
for
(
j
=
0
;
j
<
6
*
5
;
j
++
,
b
++
)
{
prev
=
b
->
prev
[
0
];
for
(
k
=
b
->
next
[
prev
];
k
<
64
;
k
=
b
->
next
[
k
])
{
if
(
b
->
mb
[
k
]
<
a
&&
b
->
mb
[
k
]
>
-
a
){
size
[
0
]
=
5
*
6
*
4
;
//EOB
for
(
j
=
0
;
j
<
6
*
5
;
j
++
,
b
++
)
{
prev
=
b
->
prev
[
0
];
for
(
k
=
b
->
next
[
prev
];
k
<
64
;
k
=
b
->
next
[
k
])
{
if
(
b
->
mb
[
k
]
<
a
&&
b
->
mb
[
k
]
>
-
a
){
b
->
next
[
prev
]
=
b
->
next
[
k
];
}
else
{
size
[
0
]
+=
dv_rl2vlc_size
(
k
-
prev
-
1
,
b
->
mb
[
k
]);
prev
=
k
;
prev
=
k
;
}
}
}
...
...
@@ -851,22 +853,22 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
enc_blk
=
&
enc_blks
[
0
];
pb
=
&
pbs
[
0
];
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
v
=
*
mb_pos_ptr
++
;
mb_x
=
v
&
0xff
;
mb_y
=
v
>>
8
;
y_ptr
=
s
->
picture
.
data
[
0
]
+
((
mb_y
*
s
->
picture
.
linesize
[
0
]
+
mb_x
)
<<
3
);
c_offset
=
(((
mb_y
>>
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV420P
))
*
s
->
picture
.
linesize
[
1
]
+
(
mb_x
>>
((
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
)
?
2
:
1
)))
<<
3
);
y_ptr
=
s
->
picture
.
data
[
0
]
+
((
mb_y
*
s
->
picture
.
linesize
[
0
]
+
mb_x
)
<<
3
);
c_offset
=
(((
mb_y
>>
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV420P
))
*
s
->
picture
.
linesize
[
1
]
+
(
mb_x
>>
((
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
)
?
2
:
1
)))
<<
3
);
do_edge_wrap
=
0
;
qnos
[
mb_index
]
=
15
;
/* No quantization */
ptr
=
dif
+
mb_index
*
80
+
4
;
for
(
j
=
0
;
j
<
6
;
j
++
)
{
for
(
j
=
0
;
j
<
6
;
j
++
)
{
int
dummy
=
0
;
if
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV422P
)
{
/* 4:2:2 */
if
(
j
==
0
||
j
==
2
)
{
/* Y0 Y1 */
data
=
y_ptr
+
((
j
>>
1
)
*
8
);
data
=
y_ptr
+
((
j
>>
1
)
*
8
);
linesize
=
s
->
picture
.
linesize
[
0
];
}
else
if
(
j
>
3
)
{
/* Cr Cb */
...
...
@@ -889,7 +891,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
linesize
=
s
->
picture
.
linesize
[
0
];
}
else
{
/* Cr and Cb blocks */
/* don't ask Fabrice why they inverted Cb and Cr ! */
data
=
s
->
picture
.
data
[
6
-
j
]
+
c_offset
;
data
=
s
->
picture
.
data
[
6
-
j
]
+
c_offset
;
linesize
=
s
->
picture
.
linesize
[
6
-
j
];
if
(
s
->
sys
->
pix_fmt
==
PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
do_edge_wrap
=
1
;
...
...
@@ -900,7 +902,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
if
(
do_edge_wrap
)
{
/* Edge wrap copy: 4x16 -> 8x8 */
uint8_t
*
d
;
DCTELEM
*
b
=
block
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
d
=
data
+
8
*
linesize
;
b
[
0
]
=
data
[
0
];
b
[
1
]
=
data
[
1
];
b
[
2
]
=
data
[
2
];
b
[
3
]
=
data
[
3
];
b
[
4
]
=
d
[
0
];
b
[
5
]
=
d
[
1
];
b
[
6
]
=
d
[
2
];
b
[
7
]
=
d
[
3
];
...
...
@@ -912,7 +914,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
s
->
get_pixels
(
block
,
data
,
linesize
);
}
if
(
s
->
avctx
->
flags
&
CODEC_FLAG_INTERLACED_DCT
)
if
(
s
->
avctx
->
flags
&
CODEC_FLAG_INTERLACED_DCT
)
enc_blk
->
dct_mode
=
dv_guess_dct_mode
(
block
);
else
enc_blk
->
dct_mode
=
0
;
...
...
@@ -950,33 +952,33 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
if
(
vs_total_ac_bits
<
vs_bit_size
)
dv_guess_qnos
(
&
enc_blks
[
0
],
&
qnos
[
0
]);
for
(
i
=
0
;
i
<
5
;
i
++
)
{
for
(
i
=
0
;
i
<
5
;
i
++
)
{
dif
[
i
*
80
+
3
]
=
qnos
[
i
];
}
/* First pass over individual cells only */
for
(
j
=
0
;
j
<
5
*
6
;
j
++
)
for
(
j
=
0
;
j
<
5
*
6
;
j
++
)
dv_encode_ac
(
&
enc_blks
[
j
],
&
pbs
[
j
],
&
pbs
[
j
+
1
]);
/* Second pass over each MB space */
for
(
j
=
0
;
j
<
5
*
6
;
j
+=
6
)
{
pb
=
&
pbs
[
j
];
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
j
=
0
;
j
<
5
*
6
;
j
+=
6
)
{
pb
=
&
pbs
[
j
];
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
enc_blks
[
i
+
j
].
partial_bit_count
)
pb
=
dv_encode_ac
(
&
enc_blks
[
i
+
j
],
pb
,
&
pbs
[
j
+
6
]);
pb
=
dv_encode_ac
(
&
enc_blks
[
i
+
j
],
pb
,
&
pbs
[
j
+
6
]);
}
}
/* Third and final pass over the whole video segment space */
pb
=
&
pbs
[
0
];
for
(
j
=
0
;
j
<
5
*
6
;
j
++
)
{
pb
=
&
pbs
[
0
];
for
(
j
=
0
;
j
<
5
*
6
;
j
++
)
{
if
(
enc_blks
[
j
].
partial_bit_count
)
pb
=
dv_encode_ac
(
&
enc_blks
[
j
],
pb
,
&
pbs
[
6
*
5
]);
pb
=
dv_encode_ac
(
&
enc_blks
[
j
],
pb
,
&
pbs
[
6
*
5
]);
if
(
enc_blks
[
j
].
partial_bit_count
)
av_log
(
NULL
,
AV_LOG_ERROR
,
"ac bitstream overflow
\n
"
);
}
for
(
j
=
0
;
j
<
5
*
6
;
j
++
)
for
(
j
=
0
;
j
<
5
*
6
;
j
++
)
flush_put_bits
(
&
pbs
[
j
]);
}
...
...
@@ -1002,8 +1004,10 @@ static int dv_decode_mt(AVCodecContext *avctx, void* sl)
(
DV_PROFILE_IS_720p50
(
s
->
sys
)
&&
seq
>
9
))
return
0
;
dv_decode_video_segment
(
s
,
&
s
->
buf
[(
seq
*
6
+
(
chan_slice
/
3
)
+
chan_slice
*
5
+
7
)
*
80
+
chan_offset
],
&
s
->
sys
->
video_place
[
slice
*
5
]);
dv_decode_video_segment
(
s
,
&
s
->
buf
[(
seq
*
6
+
(
chan_slice
/
3
)
+
chan_slice
*
5
+
7
)
*
80
+
chan_offset
],
&
s
->
sys
->
video_place
[
slice
*
5
]);
return
0
;
}
...
...
@@ -1022,8 +1026,10 @@ static int dv_encode_mt(AVCodecContext *avctx, void* sl)
/* byte offset of this channel's data */
int
chan_offset
=
chan
*
s
->
sys
->
difseg_size
*
150
*
80
;
dv_encode_video_segment
(
s
,
&
s
->
buf
[((
chan_slice
/
27
)
*
6
+
(
chan_slice
/
3
)
+
chan_slice
*
5
+
7
)
*
80
+
chan_offset
],
&
s
->
sys
->
video_place
[
slice
*
5
]);
dv_encode_video_segment
(
s
,
&
s
->
buf
[((
chan_slice
/
27
)
*
6
+
(
chan_slice
/
3
)
+
chan_slice
*
5
+
7
)
*
80
+
chan_offset
],
&
s
->
sys
->
video_place
[
slice
*
5
]);
return
0
;
}
#endif
...
...
@@ -1041,7 +1047,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
if
(
!
s
->
sys
||
buf_size
<
s
->
sys
->
frame_size
)
return
-
1
;
/* NOTE: we only accept several full frames */
if
(
s
->
picture
.
data
[
0
])
if
(
s
->
picture
.
data
[
0
])
avctx
->
release_buffer
(
avctx
,
&
s
->
picture
);
s
->
picture
.
reference
=
0
;
...
...
@@ -1050,7 +1056,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
avctx
->
pix_fmt
=
s
->
sys
->
pix_fmt
;
avctx
->
time_base
=
s
->
sys
->
time_base
;
avcodec_set_dimensions
(
avctx
,
s
->
sys
->
width
,
s
->
sys
->
height
);
if
(
avctx
->
get_buffer
(
avctx
,
&
s
->
picture
)
<
0
)
{
if
(
avctx
->
get_buffer
(
avctx
,
&
s
->
picture
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
-
1
;
}
...
...
@@ -1065,14 +1071,15 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
/* return image */
*
data_size
=
sizeof
(
AVFrame
);
*
(
AVFrame
*
)
data
=
s
->
picture
;
*
(
AVFrame
*
)
data
=
s
->
picture
;
return
s
->
sys
->
frame_size
;
}
#endif
/* CONFIG_DVVIDEO_DECODER */
static
inline
int
dv_write_pack
(
enum
dv_pack_type
pack_id
,
DVVideoContext
*
c
,
uint8_t
*
buf
)
static
inline
int
dv_write_pack
(
enum
dv_pack_type
pack_id
,
DVVideoContext
*
c
,
uint8_t
*
buf
)
{
/*
* Here's what SMPTE314M says about these two:
...
...
@@ -1096,7 +1103,7 @@ static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, ui
int
stype
=
(
c
->
sys
->
pix_fmt
==
PIX_FMT_YUV422P
?
4
:
0
);
uint8_t
aspect
=
0
;
if
((
int
)(
av_q2d
(
c
->
avctx
->
sample_aspect_ratio
)
*
c
->
avctx
->
width
/
c
->
avctx
->
height
*
10
)
==
17
)
/* 16:9 */
if
((
int
)(
av_q2d
(
c
->
avctx
->
sample_aspect_ratio
)
*
c
->
avctx
->
width
/
c
->
avctx
->
height
*
10
)
==
17
)
/* 16:9 */
aspect
=
0x02
;
buf
[
0
]
=
(
uint8_t
)
pack_id
;
...
...
@@ -1203,7 +1210,7 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
s
->
sys
=
dv_codec_profile
(
c
);
if
(
!
s
->
sys
)
return
-
1
;
if
(
buf_size
<
s
->
sys
->
frame_size
)
if
(
buf_size
<
s
->
sys
->
frame_size
)
return
-
1
;
c
->
pix_fmt
=
s
->
sys
->
pix_fmt
;
...
...
@@ -1227,7 +1234,7 @@ static int dvvideo_close(AVCodecContext *c)
{
DVVideoContext
*
s
=
c
->
priv_data
;
if
(
s
->
picture
.
data
[
0
])
if
(
s
->
picture
.
data
[
0
])
c
->
release_buffer
(
c
,
&
s
->
picture
);
return
0
;
...
...
libavcodec/dvdata.h
View file @
f94036f1
...
...
@@ -52,9 +52,9 @@ typedef struct DVprofile {
int
bpm
;
/* blocks per macroblock */
const
uint8_t
*
block_sizes
;
/* AC block sizes, in bits */
int
audio_stride
;
/* size of audio_shuffle table */
int
audio_min_samples
[
3
];
/* min amount of audio samples */
int
audio_min_samples
[
3
];
/* min amount of audio samples */
/* for 48kHz, 44.1kHz and 32kHz */
int
audio_samples_dist
[
5
];
/* how many samples are supposed to be */
int
audio_samples_dist
[
5
];
/* how many samples are supposed to be */
/* in each frame in a 5 frames window */
const
uint8_t
(
*
audio_shuffle
)[
9
];
/* PCM shuffling table */
}
DVprofile
;
...
...
@@ -6360,7 +6360,8 @@ enum dv_pack_type {
#define DV_PROFILE_IS_1080i50(p) (((p)->video_stype == 0x14) && ((p)->dsf == 1))
#define DV_PROFILE_IS_720p50(p) (((p)->video_stype == 0x18) && ((p)->dsf == 1))
/* minimum number of bytes to read from a DV stream in order to determine the profile */
/* minimum number of bytes to read from a DV stream in order to
determine the profile */
#define DV_PROFILE_BYTES (6*80)
/* 6 DIF blocks */
/**
...
...
@@ -6398,18 +6399,20 @@ static const DVprofile* dv_codec_profile(AVCodecContext* codec)
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
codec
->
height
==
dv_profiles
[
i
].
height
&&
codec
->
pix_fmt
==
dv_profiles
[
i
].
pix_fmt
&&
if
(
codec
->
height
==
dv_profiles
[
i
].
height
&&
codec
->
pix_fmt
==
dv_profiles
[
i
].
pix_fmt
&&
codec
->
width
==
dv_profiles
[
i
].
width
)
return
&
dv_profiles
[
i
];
return
NULL
;
}
static
inline
int
dv_write_dif_id
(
enum
dv_section_type
t
,
uint8_t
chan_num
,
uint8_t
seq_num
,
uint8_t
dif_num
,
uint8_t
*
buf
)
static
inline
int
dv_write_dif_id
(
enum
dv_section_type
t
,
uint8_t
chan_num
,
uint8_t
seq_num
,
uint8_t
dif_num
,
uint8_t
*
buf
)
{
buf
[
0
]
=
(
uint8_t
)
t
;
/* Section type */
buf
[
1
]
=
(
seq_num
<<
4
)
|
/* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
buf
[
1
]
=
(
seq_num
<<
4
)
|
/* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
(
chan_num
<<
3
)
|
/* FSC: for 50Mb/s 0 - first channel; 1 - second */
7
;
/* reserved -- always 1 */
buf
[
2
]
=
dif_num
;
/* DIF block number Video: 0-134, Audio: 0-8 */
...
...
@@ -6420,17 +6423,17 @@ static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num, uint
static
inline
int
dv_write_ssyb_id
(
uint8_t
syb_num
,
uint8_t
fr
,
uint8_t
*
buf
)
{
if
(
syb_num
==
0
||
syb_num
==
6
)
{
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
(
0
<<
4
)
|
/* AP3 (Subcode application ID) */
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
(
0
<<
4
)
|
/* AP3 (Subcode application ID) */
0x0f
;
/* reserved -- always 1 */
}
else
if
(
syb_num
==
11
)
{
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
0x7f
;
/* reserved -- always 1 */
}
else
{
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
(
0
<<
4
)
|
/* APT (Track application ID) */
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
(
0
<<
4
)
|
/* APT (Track application ID) */
0x0f
;
/* reserved -- always 1 */
}
buf
[
1
]
=
0xf0
|
/* reserved -- always 1 */
...
...
libavformat/dv.c
View file @
f94036f1
...
...
@@ -119,11 +119,11 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
return
-
1
;
/* unsupported quantization */
size
=
(
sys
->
audio_min_samples
[
freq
]
+
smpls
)
*
4
;
/* 2ch, 2bytes */
half_ch
=
sys
->
difseg_size
/
2
;
half_ch
=
sys
->
difseg_size
/
2
;
/* We work with 720p frames split in half, thus even frames have
* channels 0,1 and odd 2,3 */
ipcm
=
(
sys
->
height
==
720
&&
!
(
frame
[
1
]
&
0x0C
))
?
2
:
0
;
* channels 0,1 and odd 2,3
.
*/
ipcm
=
(
sys
->
height
==
720
&&
!
(
frame
[
1
]
&
0x0C
))
?
2
:
0
;
pcm
=
ppcm
[
ipcm
++
];
/* for each DIF channel */
...
...
@@ -142,7 +142,7 @@ 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
;
of
=
sys
->
audio_shuffle
[
i
][
j
]
+
(
d
-
8
)
/
2
*
sys
->
audio_stride
;
if
(
of
*
2
>=
size
)
continue
;
...
...
@@ -158,14 +158,14 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
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
;
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
;
(
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
++
d
;
...
...
@@ -207,7 +207,7 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
ach
=
2
;
/* Dynamic handling of the audio streams in DV */
for
(
i
=
0
;
i
<
ach
;
i
++
)
{
for
(
i
=
0
;
i
<
ach
;
i
++
)
{
if
(
!
c
->
ast
[
i
])
{
c
->
ast
[
i
]
=
av_new_stream
(
c
->
fctx
,
0
);
if
(
!
c
->
ast
[
i
])
...
...
@@ -242,9 +242,10 @@ static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame)
if
(
c
->
sys
)
{
avctx
=
c
->
vst
->
codec
;
av_set_pts_info
(
c
->
vst
,
64
,
c
->
sys
->
time_base
.
num
,
c
->
sys
->
time_base
.
den
);
av_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
){
if
(
!
avctx
->
width
){
avctx
->
width
=
c
->
sys
->
width
;
avctx
->
height
=
c
->
sys
->
height
;
}
...
...
@@ -301,7 +302,7 @@ int dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
int
size
=
-
1
;
int
i
;
for
(
i
=
0
;
i
<
c
->
ach
;
i
++
)
{
for
(
i
=
0
;
i
<
c
->
ach
;
i
++
)
{
if
(
c
->
ast
[
i
]
&&
c
->
audio_pkt
[
i
].
size
)
{
*
pkt
=
c
->
audio_pkt
[
i
];
c
->
audio_pkt
[
i
].
size
=
0
;
...
...
@@ -328,7 +329,7 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
/* Queueing audio packet */
/* FIXME: in case of no audio/bad audio we have to do something */
size
=
dv_extract_audio_info
(
c
,
buf
);
for
(
i
=
0
;
i
<
c
->
ach
;
i
++
)
{
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
;
ppcm
[
i
]
=
c
->
audio_buf
[
i
];
...
...
@@ -339,7 +340,7 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
/* We work with 720p frames split in half, thus even frames have
* channels 0,1 and odd 2,3. */
if
(
c
->
sys
->
height
==
720
)
{
if
(
buf
[
1
]
&
0x0C
)
if
(
buf
[
1
]
&
0x0C
)
c
->
audio_pkt
[
2
].
size
=
c
->
audio_pkt
[
3
].
size
=
0
;
else
c
->
audio_pkt
[
0
].
size
=
c
->
audio_pkt
[
1
].
size
=
0
;
...
...
@@ -444,12 +445,12 @@ static int dv_read_seek(AVFormatContext *s, int stream_index,
{
RawDVContext
*
r
=
s
->
priv_data
;
DVDemuxContext
*
c
=
r
->
dv_demux
;
int64_t
offset
=
dv_frame_offset
(
s
,
c
,
timestamp
,
flags
);
int64_t
offset
=
dv_frame_offset
(
s
,
c
,
timestamp
,
flags
);
dv_offset_reset
(
c
,
offset
/
c
->
sys
->
frame_size
);
offset
=
url_fseek
(
s
->
pb
,
offset
,
SEEK_SET
);
return
(
offset
<
0
)
?
offset
:
0
;
return
(
offset
<
0
)
?
offset
:
0
;
}
static
int
dv_read_close
(
AVFormatContext
*
s
)
...
...
libavformat/dvenc.c
View file @
f94036f1
...
...
@@ -63,7 +63,7 @@ static const int dv_aaux_packs_dist[12][9] = {
static
int
dv_audio_frame_size
(
const
DVprofile
*
sys
,
int
frame
)
{
return
sys
->
audio_samples_dist
[
frame
%
(
sizeof
(
sys
->
audio_samples_dist
)
/
return
sys
->
audio_samples_dist
[
frame
%
(
sizeof
(
sys
->
audio_samples_dist
)
/
sizeof
(
sys
->
audio_samples_dist
[
0
]))];
}
...
...
@@ -77,14 +77,14 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
buf
[
0
]
=
(
uint8_t
)
pack_id
;
switch
(
pack_id
)
{
case
dv_timecode
:
ct
=
(
time_t
)
av_rescale_rnd
(
c
->
frames
,
c
->
sys
->
time_base
.
num
,
c
->
sys
->
time_base
.
den
,
AV_ROUND_DOWN
);
ct
=
(
time_t
)
av_rescale_rnd
(
c
->
frames
,
c
->
sys
->
time_base
.
num
,
c
->
sys
->
time_base
.
den
,
AV_ROUND_DOWN
);
brktimegm
(
ct
,
&
tc
);
/*
* LTC drop-frame frame counter drops two frames (0 and 1) every
* minute, unless it is exactly divisible by 10
*/
ltc_frame
=
(
c
->
frames
+
2
*
ct
/
60
-
2
*
ct
/
600
)
%
c
->
sys
->
ltc_divisor
;
ltc_frame
=
(
c
->
frames
+
2
*
ct
/
60
-
2
*
ct
/
600
)
%
c
->
sys
->
ltc_divisor
;
buf
[
1
]
=
(
0
<<
7
)
|
/* color frame: 0 - unsync; 1 - sync mode */
(
1
<<
6
)
|
/* drop frame timecode: 0 - nondrop; 1 - drop */
((
ltc_frame
/
10
)
<<
4
)
|
/* tens of frames */
...
...
@@ -132,7 +132,7 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
7
;
buf
[
3
]
=
(
1
<<
7
)
|
/* direction: 1 -- forward */
(
c
->
sys
->
pix_fmt
==
PIX_FMT_YUV420P
?
0x20
:
/* speed */
c
->
sys
->
ltc_divisor
*
4
);
c
->
sys
->
ltc_divisor
*
4
);
buf
[
4
]
=
(
1
<<
7
)
|
/* reserved -- always 1 */
0x7f
;
/* genre category */
break
;
...
...
@@ -264,10 +264,10 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st,
}
/* Let us see if we have enough data to construct one DV frame. */
if
(
c
->
has_video
==
1
&&
c
->
has_audio
+
1
==
1
<<
c
->
n_ast
)
{
if
(
c
->
has_video
==
1
&&
c
->
has_audio
+
1
==
1
<<
c
->
n_ast
)
{
dv_inject_metadata
(
c
,
*
frame
);
c
->
has_audio
=
0
;
for
(
i
=
0
;
i
<
c
->
n_ast
;
i
++
)
{
for
(
i
=
0
;
i
<
c
->
n_ast
;
i
++
)
{
dv_inject_audio
(
c
,
i
,
*
frame
);
av_fifo_drain
(
&
c
->
audio_data
[
i
],
reqasize
);
c
->
has_audio
|=
((
reqasize
<=
av_fifo_size
(
&
c
->
audio_data
[
i
]))
<<
i
);
...
...
@@ -325,7 +325,7 @@ DVMuxContext* dv_init_mux(AVFormatContext* s)
if
(
!
c
->
sys
)
goto
bail_out
;
if
((
c
->
n_ast
>
1
)
&&
(
c
->
sys
->
n_difchan
<
2
))
{
if
((
c
->
n_ast
>
1
)
&&
(
c
->
sys
->
n_difchan
<
2
))
{
/* only 1 stereo pair is allowed in 25Mbps mode */
goto
bail_out
;
}
...
...
@@ -336,9 +336,9 @@ DVMuxContext* dv_init_mux(AVFormatContext* s)
c
->
has_video
=
0
;
c
->
start_time
=
(
time_t
)
s
->
timestamp
;
for
(
i
=
0
;
i
<
c
->
n_ast
;
i
++
)
{
for
(
i
=
0
;
i
<
c
->
n_ast
;
i
++
)
{
if
(
c
->
ast
[
i
]
&&
av_fifo_init
(
&
c
->
audio_data
[
i
],
100
*
AVCODEC_MAX_AUDIO_FRAME_SIZE
)
<
0
)
{
while
(
i
>
0
)
{
while
(
i
>
0
)
{
i
--
;
av_fifo_free
(
&
c
->
audio_data
[
i
]);
}
...
...
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