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
ee0ebd3c
Commit
ee0ebd3c
authored
Sep 08, 2014
by
Gabriel Dume
Committed by
Diego Biurrun
Sep 09, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dv: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
f629705b
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1029 additions
and
989 deletions
+1029
-989
dv.c
libavcodec/dv.c
+122
-115
dv.h
libavcodec/dv.h
+38
-35
dv_profile.c
libavcodec/dv_profile.c
+190
-199
dv_tablegen.h
libavcodec/dv_tablegen.h
+35
-35
dvdata.c
libavcodec/dvdata.c
+247
-247
dvdec.c
libavcodec/dvdec.c
+87
-75
dvenc.c
libavcodec/dvenc.c
+310
-283
No files found.
libavcodec/dv.c
View file @
ee0ebd3c
...
...
@@ -40,128 +40,135 @@
#include "libavutil/internal.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "dv.h"
#include "dvdata.h"
#include "get_bits.h"
#include "internal.h"
#include "put_bits.h"
#include "simple_idct.h"
#include "dvdata.h"
#include "dv.h"
/* XXX: also include quantization */
RL_VLC_ELEM
ff_dv_rl_vlc
[
1184
];
static
inline
void
dv_calc_mb_coordinates
(
const
AVDVProfile
*
d
,
int
chan
,
int
seq
,
int
slot
,
uint16_t
*
tbl
)
static
inline
void
dv_calc_mb_coordinates
(
const
AVDVProfile
*
d
,
int
chan
,
int
seq
,
int
slot
,
uint16_t
*
tbl
)
{
static
const
uint8_t
off
[]
=
{
2
,
6
,
8
,
0
,
4
};
static
const
uint8_t
off
[]
=
{
2
,
6
,
8
,
0
,
4
};
static
const
uint8_t
shuf1
[]
=
{
36
,
18
,
54
,
0
,
72
};
static
const
uint8_t
shuf2
[]
=
{
24
,
12
,
36
,
0
,
48
};
static
const
uint8_t
shuf3
[]
=
{
18
,
9
,
27
,
0
,
36
};
static
const
uint8_t
shuf3
[]
=
{
18
,
9
,
27
,
0
,
36
};
static
const
uint8_t
l_start
[]
=
{
0
,
4
,
9
,
13
,
18
,
22
,
27
,
31
,
36
,
40
};
static
const
uint8_t
l_start
[]
=
{
0
,
4
,
9
,
13
,
18
,
22
,
27
,
31
,
36
,
40
};
static
const
uint8_t
l_start_shuffled
[]
=
{
9
,
4
,
13
,
0
,
18
};
static
const
uint8_t
serpent1
[]
=
{
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
};
static
const
uint8_t
serpent2
[]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
5
,
4
,
3
,
2
,
1
,
0
,
0
,
1
,
2
,
3
,
4
,
5
,
5
,
4
,
3
,
2
,
1
,
0
,
0
,
1
,
2
,
3
,
4
,
5
};
static
const
uint8_t
remap
[][
2
]
=
{{
0
,
0
},
{
0
,
0
},
{
0
,
0
},
{
0
,
0
},
/* dummy */
{
0
,
0
},
{
0
,
1
},
{
0
,
2
},
{
0
,
3
},
{
10
,
0
},
{
10
,
1
},
{
10
,
2
},
{
10
,
3
},
{
20
,
0
},
{
20
,
1
},
{
20
,
2
},
{
20
,
3
},
{
30
,
0
},
{
30
,
1
},
{
30
,
2
},
{
30
,
3
},
{
40
,
0
},
{
40
,
1
},
{
40
,
2
},
{
40
,
3
},
{
50
,
0
},
{
50
,
1
},
{
50
,
2
},
{
50
,
3
},
{
60
,
0
},
{
60
,
1
},
{
60
,
2
},
{
60
,
3
},
{
70
,
0
},
{
70
,
1
},
{
70
,
2
},
{
70
,
3
},
{
0
,
64
},
{
0
,
65
},
{
0
,
66
},
{
10
,
64
},
{
10
,
65
},
{
10
,
66
},
{
20
,
64
},
{
20
,
65
},
{
20
,
66
},
{
30
,
64
},
{
30
,
65
},
{
30
,
66
},
{
40
,
64
},
{
40
,
65
},
{
40
,
66
},
{
50
,
64
},
{
50
,
65
},
{
50
,
66
},
{
60
,
64
},
{
60
,
65
},
{
60
,
66
},
{
70
,
64
},
{
70
,
65
},
{
70
,
66
},
{
0
,
67
},
{
20
,
67
},
{
40
,
67
},
{
60
,
67
}};
static
const
uint8_t
serpent1
[]
=
{
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
,
2
,
1
,
0
,
0
,
1
,
2
};
static
const
uint8_t
serpent2
[]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
5
,
4
,
3
,
2
,
1
,
0
,
0
,
1
,
2
,
3
,
4
,
5
,
5
,
4
,
3
,
2
,
1
,
0
,
0
,
1
,
2
,
3
,
4
,
5
};
static
const
uint8_t
remap
[][
2
]
=
{
{
0
,
0
},
{
0
,
0
},
{
0
,
0
},
{
0
,
0
},
/* dummy */
{
0
,
0
},
{
0
,
1
},
{
0
,
2
},
{
0
,
3
},
{
10
,
0
},
{
10
,
1
},
{
10
,
2
},
{
10
,
3
},
{
20
,
0
},
{
20
,
1
},
{
20
,
2
},
{
20
,
3
},
{
30
,
0
},
{
30
,
1
},
{
30
,
2
},
{
30
,
3
},
{
40
,
0
},
{
40
,
1
},
{
40
,
2
},
{
40
,
3
},
{
50
,
0
},
{
50
,
1
},
{
50
,
2
},
{
50
,
3
},
{
60
,
0
},
{
60
,
1
},
{
60
,
2
},
{
60
,
3
},
{
70
,
0
},
{
70
,
1
},
{
70
,
2
},
{
70
,
3
},
{
0
,
64
},
{
0
,
65
},
{
0
,
66
},
{
10
,
64
},
{
10
,
65
},
{
10
,
66
},
{
20
,
64
},
{
20
,
65
},
{
20
,
66
},
{
30
,
64
},
{
30
,
65
},
{
30
,
66
},
{
40
,
64
},
{
40
,
65
},
{
40
,
66
},
{
50
,
64
},
{
50
,
65
},
{
50
,
66
},
{
60
,
64
},
{
60
,
65
},
{
60
,
66
},
{
70
,
64
},
{
70
,
65
},
{
70
,
66
},
{
0
,
67
},
{
20
,
67
},
{
40
,
67
},
{
60
,
67
}
};
int
i
,
k
,
m
;
int
x
,
y
,
blk
;
for
(
m
=
0
;
m
<
5
;
m
++
)
{
switch
(
d
->
width
)
{
case
1440
:
blk
=
(
chan
*
11
+
seq
)
*
27
+
slot
;
if
(
chan
==
0
&&
seq
==
11
)
{
x
=
m
*
27
+
slot
;
if
(
x
<
90
)
{
y
=
0
;
}
else
{
x
=
(
x
-
90
)
*
2
;
y
=
67
;
}
}
else
{
i
=
(
4
*
chan
+
blk
+
off
[
m
])
%
11
;
k
=
(
blk
/
11
)
%
27
;
x
=
shuf1
[
m
]
+
(
chan
&
1
)
*
9
+
k
%
9
;
y
=
(
i
*
3
+
k
/
9
)
*
2
+
(
chan
>>
1
)
+
1
;
}
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
1280
:
blk
=
(
chan
*
10
+
seq
)
*
27
+
slot
;
i
=
(
4
*
chan
+
(
seq
/
5
)
+
2
*
blk
+
off
[
m
])
%
10
;
k
=
(
blk
/
5
)
%
27
;
x
=
shuf1
[
m
]
+
(
chan
&
1
)
*
9
+
k
%
9
;
y
=
(
i
*
3
+
k
/
9
)
*
2
+
(
chan
>>
1
)
+
4
;
if
(
x
>=
80
)
{
x
=
remap
[
y
][
0
]
+
((
x
-
80
)
<<
(
y
>
59
));
y
=
remap
[
y
][
1
];
}
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
960
:
blk
=
(
chan
*
10
+
seq
)
*
27
+
slot
;
i
=
(
4
*
chan
+
(
seq
/
5
)
+
2
*
blk
+
off
[
m
])
%
10
;
k
=
(
blk
/
5
)
%
27
+
(
i
&
1
)
*
3
;
x
=
shuf2
[
m
]
+
k
%
6
+
6
*
(
chan
&
1
);
y
=
l_start
[
i
]
+
k
/
6
+
45
*
(
chan
>>
1
);
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
for
(
m
=
0
;
m
<
5
;
m
++
)
{
switch
(
d
->
width
)
{
case
1440
:
blk
=
(
chan
*
11
+
seq
)
*
27
+
slot
;
if
(
chan
==
0
&&
seq
==
11
)
{
x
=
m
*
27
+
slot
;
if
(
x
<
90
)
{
y
=
0
;
}
else
{
x
=
(
x
-
90
)
*
2
;
y
=
67
;
}
}
else
{
i
=
(
4
*
chan
+
blk
+
off
[
m
])
%
11
;
k
=
(
blk
/
11
)
%
27
;
x
=
shuf1
[
m
]
+
(
chan
&
1
)
*
9
+
k
%
9
;
y
=
(
i
*
3
+
k
/
9
)
*
2
+
(
chan
>>
1
)
+
1
;
}
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
1280
:
blk
=
(
chan
*
10
+
seq
)
*
27
+
slot
;
i
=
(
4
*
chan
+
(
seq
/
5
)
+
2
*
blk
+
off
[
m
])
%
10
;
k
=
(
blk
/
5
)
%
27
;
x
=
shuf1
[
m
]
+
(
chan
&
1
)
*
9
+
k
%
9
;
y
=
(
i
*
3
+
k
/
9
)
*
2
+
(
chan
>>
1
)
+
4
;
if
(
x
>=
80
)
{
x
=
remap
[
y
][
0
]
+
((
x
-
80
)
<<
(
y
>
59
));
y
=
remap
[
y
][
1
];
}
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
960
:
blk
=
(
chan
*
10
+
seq
)
*
27
+
slot
;
i
=
(
4
*
chan
+
(
seq
/
5
)
+
2
*
blk
+
off
[
m
])
%
10
;
k
=
(
blk
/
5
)
%
27
+
(
i
&
1
)
*
3
;
x
=
shuf2
[
m
]
+
k
%
6
+
6
*
(
chan
&
1
);
y
=
l_start
[
i
]
+
k
/
6
+
45
*
(
chan
>>
1
);
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
720
:
switch
(
d
->
pix_fmt
)
{
case
AV_PIX_FMT_YUV422P
:
x
=
shuf3
[
m
]
+
slot
/
3
;
y
=
serpent1
[
slot
]
+
((((
seq
+
off
[
m
])
%
d
->
difseg_size
)
<<
1
)
+
chan
)
*
3
;
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
8
);
break
;
case
AV_PIX_FMT_YUV420P
:
x
=
shuf3
[
m
]
+
slot
/
3
;
y
=
serpent1
[
slot
]
+
((
seq
+
off
[
m
])
%
d
->
difseg_size
)
*
3
;
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
AV_PIX_FMT_YUV411P
:
i
=
(
seq
+
off
[
m
])
%
d
->
difseg_size
;
k
=
slot
+
((
m
==
1
||
m
==
2
)
?
3
:
0
);
x
=
l_start_shuffled
[
m
]
+
k
/
6
;
y
=
serpent2
[
k
]
+
i
*
6
;
if
(
x
>
21
)
y
=
y
*
2
-
i
*
6
;
tbl
[
m
]
=
(
x
<<
2
)
|
(
y
<<
8
);
break
;
}
switch
(
d
->
pix_fmt
)
{
case
AV_PIX_FMT_YUV422P
:
x
=
shuf3
[
m
]
+
slot
/
3
;
y
=
serpent1
[
slot
]
+
((((
seq
+
off
[
m
])
%
d
->
difseg_size
)
<<
1
)
+
chan
)
*
3
;
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
8
);
break
;
case
AV_PIX_FMT_YUV420P
:
x
=
shuf3
[
m
]
+
slot
/
3
;
y
=
serpent1
[
slot
]
+
((
seq
+
off
[
m
])
%
d
->
difseg_size
)
*
3
;
tbl
[
m
]
=
(
x
<<
1
)
|
(
y
<<
9
);
break
;
case
AV_PIX_FMT_YUV411P
:
i
=
(
seq
+
off
[
m
])
%
d
->
difseg_size
;
k
=
slot
+
((
m
==
1
||
m
==
2
)
?
3
:
0
);
x
=
l_start_shuffled
[
m
]
+
k
/
6
;
y
=
serpent2
[
k
]
+
i
*
6
;
if
(
x
>
21
)
y
=
y
*
2
-
i
*
6
;
tbl
[
m
]
=
(
x
<<
2
)
|
(
y
<<
8
);
break
;
}
default:
break
;
break
;
}
}
}
...
...
@@ -173,11 +180,11 @@ static const uint8_t dv100_qstep[16] = {
2
,
3
,
4
,
5
,
6
,
7
,
8
,
16
,
18
,
20
,
22
,
24
,
28
,
52
};
static
const
uint8_t
dv_quant_areas
[
4
]
=
{
6
,
21
,
43
,
64
};
static
const
uint8_t
dv_quant_areas
[
4
]
=
{
6
,
21
,
43
,
64
};
int
ff_dv_init_dynamic_tables
(
DVVideoContext
*
ctx
,
const
AVDVProfile
*
d
)
{
int
j
,
i
,
c
,
s
,
p
;
int
j
,
i
,
c
,
s
,
p
;
uint32_t
*
factor1
,
*
factor2
;
const
int
*
iweight1
,
*
iweight2
;
...
...
@@ -189,8 +196,8 @@ int ff_dv_init_dynamic_tables(DVVideoContext *ctx, const AVDVProfile *d)
p
+=
!
(
j
%
3
);
if
(
!
(
DV_PROFILE_IS_1080i50
(
d
)
&&
c
!=
0
&&
s
==
11
)
&&
!
(
DV_PROFILE_IS_720p50
(
d
)
&&
s
>
9
))
{
dv_calc_mb_coordinates
(
d
,
c
,
s
,
j
,
&
ctx
->
work_chunks
[
i
].
mb_coordinates
[
0
]);
ctx
->
work_chunks
[
i
++
].
buf_offset
=
p
;
dv_calc_mb_coordinates
(
d
,
c
,
s
,
j
,
&
ctx
->
work_chunks
[
i
].
mb_coordinates
[
0
]);
ctx
->
work_chunks
[
i
++
].
buf_offset
=
p
;
}
p
+=
5
;
}
...
...
@@ -240,10 +247,10 @@ av_cold int ff_dvvideo_init(AVCodecContext *avctx)
if
(
!
done
)
{
VLC
dv_vlc
;
uint16_t
new_dv_vlc_bits
[
NB_DV_VLC
*
2
];
uint8_t
new_dv_vlc_len
[
NB_DV_VLC
*
2
];
uint8_t
new_dv_vlc_run
[
NB_DV_VLC
*
2
];
int16_t
new_dv_vlc_level
[
NB_DV_VLC
*
2
];
uint16_t
new_dv_vlc_bits
[
NB_DV_VLC
*
2
];
uint8_t
new_dv_vlc_len
[
NB_DV_VLC
*
2
];
uint8_t
new_dv_vlc_run
[
NB_DV_VLC
*
2
];
int16_t
new_dv_vlc_level
[
NB_DV_VLC
*
2
];
done
=
1
;
...
...
@@ -267,21 +274,21 @@ av_cold int ff_dvvideo_init(AVCodecContext *avctx)
}
/* NOTE: as a trick, we use the fact the no codes are unused
to accelerate the parsing of partial codes */
init_vlc
(
&
dv_vlc
,
TEX_VLC_BITS
,
j
,
new_dv_vlc_len
,
1
,
1
,
new_dv_vlc_bits
,
2
,
2
,
0
);
*
to accelerate the parsing of partial codes */
init_vlc
(
&
dv_vlc
,
TEX_VLC_BITS
,
j
,
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
++
){
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
if
(
len
<
0
)
{
//
more bits needed
run
=
0
;
level
=
code
;
}
else
{
run
=
new_dv_vlc_run
[
code
]
+
1
;
run
=
new_dv_vlc_run
[
code
]
+
1
;
level
=
new_dv_vlc_level
[
code
];
}
ff_dv_rl_vlc
[
i
].
len
=
len
;
...
...
libavcodec/dv.h
View file @
ee0ebd3c
...
...
@@ -28,13 +28,13 @@
#define AVCODEC_DV_H
#include "avcodec.h"
#include "me_cmp.h"
#include "get_bits.h"
#include "dv_profile.h"
#include "get_bits.h"
#include "me_cmp.h"
typedef
struct
DVwork_chunk
{
uint16_t
buf_offset
;
uint16_t
mb_coordinates
[
5
];
uint16_t
buf_offset
;
uint16_t
mb_coordinates
[
5
];
}
DVwork_chunk
;
typedef
struct
DVVideoContext
{
...
...
@@ -43,7 +43,7 @@ typedef struct DVVideoContext {
AVCodecContext
*
avctx
;
uint8_t
*
buf
;
uint8_t
dv_zigzag
[
2
][
64
];
uint8_t
dv_zigzag
[
2
][
64
];
void
(
*
get_pixels
)(
int16_t
*
block
,
const
uint8_t
*
pixels
,
int
line_size
);
void
(
*
fdct
[
2
])(
int16_t
*
block
);
...
...
@@ -54,26 +54,26 @@ typedef struct DVVideoContext {
}
DVVideoContext
;
enum
dv_section_type
{
dv_sect_header
=
0x1f
,
dv_sect_subcode
=
0x3f
,
dv_sect_vaux
=
0x56
,
dv_sect_audio
=
0x76
,
dv_sect_video
=
0x96
,
dv_sect_header
=
0x1f
,
dv_sect_subcode
=
0x3f
,
dv_sect_vaux
=
0x56
,
dv_sect_audio
=
0x76
,
dv_sect_video
=
0x96
,
};
enum
dv_pack_type
{
dv_header525
=
0x3f
,
/* see dv_write_pack for important details on */
dv_header625
=
0xbf
,
/* these two packs */
dv_timecode
=
0x13
,
dv_audio_source
=
0x50
,
dv_audio_control
=
0x51
,
dv_audio_recdate
=
0x52
,
dv_audio_rectime
=
0x53
,
dv_video_source
=
0x60
,
dv_video_control
=
0x61
,
dv_video_recdate
=
0x62
,
dv_video_rectime
=
0x63
,
dv_unknown_pack
=
0xff
,
dv_header525
=
0x3f
,
/* see dv_write_pack for important details on */
dv_header625
=
0xbf
,
/* these two packs */
dv_timecode
=
0x13
,
dv_audio_source
=
0x50
,
dv_audio_control
=
0x51
,
dv_audio_recdate
=
0x52
,
dv_audio_rectime
=
0x53
,
dv_video_source
=
0x60
,
dv_video_control
=
0x61
,
dv_video_recdate
=
0x62
,
dv_video_rectime
=
0x63
,
dv_unknown_pack
=
0xff
,
};
#define DV_PROFILE_IS_HD(p) ((p)->video_stype & 0x10)
...
...
@@ -81,8 +81,8 @@ enum dv_pack_type {
#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 */
#define DV_PROFILE_BYTES (6
*
80)
/* 6 DIF blocks */
*
determine the profile */
#define DV_PROFILE_BYTES (6
*
80)
/* 6 DIF blocks */
/**
* largest possible DV frame, in bytes (1080i50)
...
...
@@ -103,23 +103,26 @@ int ff_dvvideo_init(AVCodecContext *avctx);
static
inline
int
dv_work_pool_size
(
const
AVDVProfile
*
d
)
{
int
size
=
d
->
n_difchan
*
d
->
difseg_size
*
27
;
int
size
=
d
->
n_difchan
*
d
->
difseg_size
*
27
;
if
(
DV_PROFILE_IS_1080i50
(
d
))
size
-=
3
*
27
;
size
-=
3
*
27
;
if
(
DV_PROFILE_IS_720p50
(
d
))
size
-=
4
*
27
;
size
-=
4
*
27
;
return
size
;
}
static
inline
void
dv_calculate_mb_xy
(
DVVideoContext
*
s
,
DVwork_chunk
*
work_chunk
,
int
m
,
int
*
mb_x
,
int
*
mb_y
)
static
inline
void
dv_calculate_mb_xy
(
DVVideoContext
*
s
,
DVwork_chunk
*
work_chunk
,
int
m
,
int
*
mb_x
,
int
*
mb_y
)
{
*
mb_x
=
work_chunk
->
mb_coordinates
[
m
]
&
0xff
;
*
mb_y
=
work_chunk
->
mb_coordinates
[
m
]
>>
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 macro blocks */
}
*
mb_x
=
work_chunk
->
mb_coordinates
[
m
]
&
0xff
;
*
mb_y
=
work_chunk
->
mb_coordinates
[
m
]
>>
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
))
/* shifting the Y coordinate down by 72/2 macro blocks */
*
mb_y
-=
(
*
mb_y
>
17
)
?
18
:
-
72
;
}
#endif
/* AVCODEC_DV_H */
libavcodec/dv_profile.c
View file @
ee0ebd3c
...
...
@@ -16,13 +16,14 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include "config.h"
#include <stdint.h>
#include "libavutil/common.h"
#include "libavutil/log.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "dv_profile.h"
#include "dv_profile_internal.h"
...
...
@@ -30,33 +31,33 @@
#if CONFIG_DVPROFILE
static
const
uint8_t
dv_audio_shuffle525
[
10
][
9
]
=
{
{
0
,
30
,
60
,
20
,
50
,
80
,
10
,
40
,
70
},
/* 1st channel */
{
6
,
36
,
66
,
26
,
56
,
86
,
16
,
46
,
76
},
{
12
,
42
,
72
,
2
,
32
,
62
,
22
,
52
,
82
},
{
18
,
48
,
78
,
8
,
38
,
68
,
28
,
58
,
88
},
{
24
,
54
,
84
,
14
,
44
,
74
,
4
,
34
,
64
},
{
0
,
30
,
60
,
20
,
50
,
80
,
10
,
40
,
70
},
/* 1st channel */
{
6
,
36
,
66
,
26
,
56
,
86
,
16
,
46
,
76
},
{
12
,
42
,
72
,
2
,
32
,
62
,
22
,
52
,
82
},
{
18
,
48
,
78
,
8
,
38
,
68
,
28
,
58
,
88
},
{
24
,
54
,
84
,
14
,
44
,
74
,
4
,
34
,
64
},
{
1
,
31
,
61
,
21
,
51
,
81
,
11
,
41
,
71
},
/* 2nd channel */
{
7
,
37
,
67
,
27
,
57
,
87
,
17
,
47
,
77
},
{
13
,
43
,
73
,
3
,
33
,
63
,
23
,
53
,
83
},
{
19
,
49
,
79
,
9
,
39
,
69
,
29
,
59
,
89
},
{
25
,
55
,
85
,
15
,
45
,
75
,
5
,
35
,
65
},
{
1
,
31
,
61
,
21
,
51
,
81
,
11
,
41
,
71
},
/* 2nd channel */
{
7
,
37
,
67
,
27
,
57
,
87
,
17
,
47
,
77
},
{
13
,
43
,
73
,
3
,
33
,
63
,
23
,
53
,
83
},
{
19
,
49
,
79
,
9
,
39
,
69
,
29
,
59
,
89
},
{
25
,
55
,
85
,
15
,
45
,
75
,
5
,
35
,
65
},
};
static
const
uint8_t
dv_audio_shuffle625
[
12
][
9
]
=
{
{
0
,
36
,
72
,
26
,
62
,
98
,
16
,
52
,
88
},
/* 1st channel */
{
6
,
42
,
78
,
32
,
68
,
104
,
22
,
58
,
94
},
{
12
,
48
,
84
,
2
,
38
,
74
,
28
,
64
,
100
},
{
18
,
54
,
90
,
8
,
44
,
80
,
34
,
70
,
106
},
{
24
,
60
,
96
,
14
,
50
,
86
,
4
,
40
,
76
},
{
30
,
66
,
102
,
20
,
56
,
92
,
10
,
46
,
82
},
{
0
,
36
,
72
,
26
,
62
,
98
,
16
,
52
,
88
},
/* 1st channel */
{
6
,
42
,
78
,
32
,
68
,
104
,
22
,
58
,
94
},
{
12
,
48
,
84
,
2
,
38
,
74
,
28
,
64
,
100
},
{
18
,
54
,
90
,
8
,
44
,
80
,
34
,
70
,
106
},
{
24
,
60
,
96
,
14
,
50
,
86
,
4
,
40
,
76
},
{
30
,
66
,
102
,
20
,
56
,
92
,
10
,
46
,
82
},
{
1
,
37
,
73
,
27
,
63
,
99
,
17
,
53
,
89
},
/* 2nd channel */
{
7
,
43
,
79
,
33
,
69
,
105
,
23
,
59
,
95
},
{
13
,
49
,
85
,
3
,
39
,
75
,
29
,
65
,
101
},
{
19
,
55
,
91
,
9
,
45
,
81
,
35
,
71
,
107
},
{
25
,
61
,
97
,
15
,
51
,
87
,
5
,
41
,
77
},
{
31
,
67
,
103
,
21
,
57
,
93
,
11
,
47
,
83
},
{
1
,
37
,
73
,
27
,
63
,
99
,
17
,
53
,
89
},
/* 2nd channel */
{
7
,
43
,
79
,
33
,
69
,
105
,
23
,
59
,
95
},
{
13
,
49
,
85
,
3
,
39
,
75
,
29
,
65
,
101
},
{
19
,
55
,
91
,
9
,
45
,
81
,
35
,
71
,
107
},
{
25
,
61
,
97
,
15
,
51
,
87
,
5
,
41
,
77
},
{
31
,
67
,
103
,
21
,
57
,
93
,
11
,
47
,
83
},
};
/* macroblock bit budgets */
...
...
@@ -69,186 +70,176 @@ static const uint8_t block_sizes_dv100[8] = {
};
static
const
AVDVProfile
dv_profiles
[]
=
{
{
.
dsf
=
0
,
.
video_stype
=
0x0
,
.
frame_size
=
120000
,
/* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
.
difseg_size
=
10
,
.
n_difchan
=
1
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{{
8
,
9
},
{
32
,
27
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
{
.
dsf
=
0
,
.
video_stype
=
0x0
,
.
frame_size
=
120000
,
/* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
.
difseg_size
=
10
,
.
n_difchan
=
1
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{
{
8
,
9
},
{
32
,
27
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* IEC 61834 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
pix_fmt
=
AV_PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* IEC 61834 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{
{
16
,
15
},
{
64
,
45
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* SMPTE-314M - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
pix_fmt
=
AV_PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* SMPTE-314M - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{
{
16
,
15
},
{
64
,
45
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x4
,
.
frame_size
=
240000
,
/* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{{
8
,
9
},
{
32
,
27
}},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x4
,
.
frame_size
=
240000
,
/* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{
{
8
,
9
},
{
32
,
27
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x4
,
.
frame_size
=
288000
,
/* SMPTE-314M - 625/50 (PAL) 50 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x4
,
.
frame_size
=
288000
,
/* SMPTE-314M - 625/50 (PAL) 50 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{
{
16
,
15
},
{
64
,
45
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x14
,
.
frame_size
=
480000
,
/* SMPTE-370M - 1080i60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
1080
,
.
width
=
1280
,
.
sar
=
{{
1
,
1
},
{
3
,
2
}},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x14
,
.
frame_size
=
480000
,
/* SMPTE-370M - 1080i60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
1080
,
.
width
=
1280
,
.
sar
=
{
{
1
,
1
},
{
3
,
2
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x14
,
.
frame_size
=
576000
,
/* SMPTE-370M - 1080i50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
1080
,
.
width
=
1440
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
108
,
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x14
,
.
frame_size
=
576000
,
/* SMPTE-370M - 1080i50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
1080
,
.
width
=
1440
,
.
sar
=
{
{
1
,
1
},
{
4
,
3
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x18
,
.
frame_size
=
240000
,
/* SMPTE-370M - 720p60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
60000
},
.
ltc_divisor
=
60
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x18
,
.
frame_size
=
240000
,
/* SMPTE-370M - 720p60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
60000
},
.
ltc_divisor
=
60
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{
{
1
,
1
},
{
4
,
3
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x18
,
.
frame_size
=
288000
,
/* SMPTE-370M - 720p50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
50
},
.
ltc_divisor
=
50
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x18
,
.
frame_size
=
288000
,
/* SMPTE-370M - 720p50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
50
},
.
ltc_divisor
=
50
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{
{
1
,
1
},
{
4
,
3
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x1
,
.
frame_size
=
144000
,
/* IEC 61883-5 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
pix_fmt
=
AV_PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x1
,
.
frame_size
=
144000
,
/* IEC 61883-5 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{
{
16
,
15
},
{
64
,
45
}
},
.
pix_fmt
=
AV_PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
}
.
audio_shuffle
=
dv_audio_shuffle625
,
}
};
void
ff_dv_print_profiles
(
void
*
logctx
,
int
loglevel
)
...
...
@@ -256,8 +247,9 @@ void ff_dv_print_profiles(void *logctx, int loglevel)
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
{
const
AVDVProfile
*
p
=
&
dv_profiles
[
i
];
av_log
(
logctx
,
loglevel
,
"Frame size: %dx%d; pixel format: %s, "
"framerate: %d/%d
\n
"
,
p
->
width
,
p
->
height
,
av_get_pix_fmt_name
(
p
->
pix_fmt
),
av_log
(
logctx
,
loglevel
,
"Frame size: %dx%d; pixel format: %s, framerate: %d/%d
\n
"
,
p
->
width
,
p
->
height
,
av_get_pix_fmt_name
(
p
->
pix_fmt
),
p
->
time_base
.
den
,
p
->
time_base
.
num
);
}
}
...
...
@@ -265,7 +257,7 @@ void ff_dv_print_profiles(void *logctx, int loglevel)
#endif
/* CONFIG_DVPROFILE */
const
AVDVProfile
*
av_dv_frame_profile
(
const
AVDVProfile
*
sys
,
const
uint8_t
*
frame
,
unsigned
buf_size
)
const
uint8_t
*
frame
,
unsigned
buf_size
)
{
#if CONFIG_DVPROFILE
int
i
,
dsf
,
stype
;
...
...
@@ -273,13 +265,12 @@ const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys,
if
(
buf_size
<
80
*
5
+
48
+
4
)
return
NULL
;
dsf
=
(
frame
[
3
]
&
0x80
)
>>
7
;
dsf
=
(
frame
[
3
]
&
0x80
)
>>
7
;
stype
=
frame
[
80
*
5
+
48
+
3
]
&
0x1f
;
/* 576i50 25Mbps 4:1:1 is a special case */
if
(
dsf
==
1
&&
stype
==
0
&&
frame
[
4
]
&
0x07
/* the APT field */
)
{
if
(
dsf
==
1
&&
stype
==
0
&&
frame
[
4
]
&
0x07
/* the APT field */
)
return
&
dv_profiles
[
2
];
}
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
dsf
==
dv_profiles
[
i
].
dsf
&&
stype
==
dv_profiles
[
i
].
video_stype
)
...
...
@@ -299,11 +290,11 @@ const AVDVProfile *av_dv_codec_profile(int width, int height,
#if CONFIG_DVPROFILE
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
height
==
dv_profiles
[
i
].
height
&&
pix_fmt
==
dv_profiles
[
i
].
pix_fmt
&&
width
==
dv_profiles
[
i
].
width
)
return
&
dv_profiles
[
i
];
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
height
==
dv_profiles
[
i
].
height
&&
pix_fmt
==
dv_profiles
[
i
].
pix_fmt
&&
width
==
dv_profiles
[
i
].
width
)
return
&
dv_profiles
[
i
];
#endif
return
NULL
;
...
...
libavcodec/dv_tablegen.h
View file @
ee0ebd3c
...
...
@@ -28,17 +28,17 @@
#include "dvdata.h"
#if CONFIG_SMALL
#define DV_VLC_MAP_RUN_SIZE 15
#define DV_VLC_MAP_LEV_SIZE 23
#define DV_VLC_MAP_RUN_SIZE
15
#define DV_VLC_MAP_LEV_SIZE
23
#else
#define DV_VLC_MAP_RUN_SIZE 64
#define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
#define DV_VLC_MAP_LEV_SIZE 512 //
FIXME sign was removed so this should be /2 but needs check
#endif
/* VLC encoding lookup table */
typedef
struct
dv_vlc_pair
{
uint32_t
vlc
;
uint32_t
size
;
uint32_t
vlc
;
uint32_t
size
;
}
dv_vlc_pair
;
#if CONFIG_HARDCODED_TABLES
...
...
@@ -51,44 +51,44 @@ static void dv_vlc_map_tableinit(void)
{
int
i
,
j
;
for
(
i
=
0
;
i
<
NB_DV_VLC
-
1
;
i
++
)
{
if
(
ff_dv_vlc_run
[
i
]
>=
DV_VLC_MAP_RUN_SIZE
)
continue
;
if
(
ff_dv_vlc_run
[
i
]
>=
DV_VLC_MAP_RUN_SIZE
)
continue
;
#if CONFIG_SMALL
if
(
ff_dv_vlc_level
[
i
]
>=
DV_VLC_MAP_LEV_SIZE
)
continue
;
if
(
ff_dv_vlc_level
[
i
]
>=
DV_VLC_MAP_LEV_SIZE
)
continue
;
#endif
if
(
dv_vlc_map
[
ff_dv_vlc_run
[
i
]][
ff_dv_vlc_level
[
i
]].
size
!=
0
)
continue
;
if
(
dv_vlc_map
[
ff_dv_vlc_run
[
i
]][
ff_dv_vlc_level
[
i
]].
size
!=
0
)
continue
;
dv_vlc_map
[
ff_dv_vlc_run
[
i
]][
ff_dv_vlc_level
[
i
]].
vlc
=
ff_dv_vlc_bits
[
i
]
<<
(
!!
ff_dv_vlc_level
[
i
]);
dv_vlc_map
[
ff_dv_vlc_run
[
i
]][
ff_dv_vlc_level
[
i
]].
size
=
ff_dv_vlc_len
[
i
]
+
(
!!
ff_dv_vlc_level
[
i
]);
dv_vlc_map
[
ff_dv_vlc_run
[
i
]][
ff_dv_vlc_level
[
i
]].
vlc
=
ff_dv_vlc_bits
[
i
]
<<
(
!!
ff_dv_vlc_level
[
i
]);
dv_vlc_map
[
ff_dv_vlc_run
[
i
]][
ff_dv_vlc_level
[
i
]].
size
=
ff_dv_vlc_len
[
i
]
+
(
!!
ff_dv_vlc_level
[
i
]);
}
for
(
i
=
0
;
i
<
DV_VLC_MAP_RUN_SIZE
;
i
++
)
{
#if CONFIG_SMALL
for
(
j
=
1
;
j
<
DV_VLC_MAP_LEV_SIZE
;
j
++
)
{
if
(
dv_vlc_map
[
i
][
j
].
size
==
0
)
{
dv_vlc_map
[
i
][
j
].
vlc
=
dv_vlc_map
[
0
][
j
].
vlc
|
(
dv_vlc_map
[
i
-
1
][
0
].
vlc
<<
(
dv_vlc_map
[
0
][
j
].
size
));
dv_vlc_map
[
i
][
j
].
size
=
dv_vlc_map
[
i
-
1
][
0
].
size
+
dv_vlc_map
[
0
][
j
].
size
;
}
}
for
(
j
=
1
;
j
<
DV_VLC_MAP_LEV_SIZE
;
j
++
)
{
if
(
dv_vlc_map
[
i
][
j
].
size
==
0
)
{
dv_vlc_map
[
i
][
j
].
vlc
=
dv_vlc_map
[
0
][
j
].
vlc
|
(
dv_vlc_map
[
i
-
1
][
0
].
vlc
<<
dv_vlc_map
[
0
][
j
].
size
);
dv_vlc_map
[
i
][
j
].
size
=
dv_vlc_map
[
i
-
1
][
0
].
size
+
dv_vlc_map
[
0
][
j
].
size
;
}
}
#else
for
(
j
=
1
;
j
<
DV_VLC_MAP_LEV_SIZE
/
2
;
j
++
)
{
if
(
dv_vlc_map
[
i
][
j
].
size
==
0
)
{
dv_vlc_map
[
i
][
j
].
vlc
=
dv_vlc_map
[
0
][
j
].
vlc
|
(
dv_vlc_map
[
i
-
1
][
0
].
vlc
<<
(
dv_vlc_map
[
0
][
j
].
size
));
dv_vlc_map
[
i
][
j
].
size
=
dv_vlc_map
[
i
-
1
][
0
].
size
+
dv_vlc_map
[
0
][
j
].
size
;
}
dv_vlc_map
[
i
][((
uint16_t
)(
-
j
))
&
0x1ff
].
vlc
=
dv_vlc_map
[
i
][
j
].
vlc
|
1
;
dv_vlc_map
[
i
][((
uint16_t
)(
-
j
))
&
0x1ff
].
size
=
dv_vlc_map
[
i
][
j
].
size
;
}
for
(
j
=
1
;
j
<
DV_VLC_MAP_LEV_SIZE
/
2
;
j
++
)
{
if
(
dv_vlc_map
[
i
][
j
].
size
==
0
)
{
dv_vlc_map
[
i
][
j
].
vlc
=
dv_vlc_map
[
0
][
j
].
vlc
|
(
dv_vlc_map
[
i
-
1
][
0
].
vlc
<<
dv_vlc_map
[
0
][
j
].
size
);
dv_vlc_map
[
i
][
j
].
size
=
dv_vlc_map
[
i
-
1
][
0
].
size
+
dv_vlc_map
[
0
][
j
].
size
;
}
dv_vlc_map
[
i
][((
uint16_t
)
(
-
j
))
&
0x1ff
].
vlc
=
dv_vlc_map
[
i
][
j
].
vlc
|
1
;
dv_vlc_map
[
i
][((
uint16_t
)
(
-
j
))
&
0x1ff
].
size
=
dv_vlc_map
[
i
][
j
].
size
;
}
#endif
}
}
...
...
libavcodec/dvdata.c
View file @
ee0ebd3c
...
...
@@ -43,51 +43,51 @@ const uint8_t ff_dv_zigzag248_direct[64] = {
/* unquant tables (not used directly) */
const
uint8_t
ff_dv_quant_shifts
[
22
][
4
]
=
{
{
3
,
3
,
4
,
4
},
{
3
,
3
,
4
,
4
},
{
2
,
3
,
3
,
4
},
{
2
,
3
,
3
,
4
},
{
2
,
2
,
3
,
3
},
{
2
,
2
,
3
,
3
},
{
1
,
2
,
2
,
3
},
{
1
,
2
,
2
,
3
},
{
1
,
1
,
2
,
2
},
{
1
,
1
,
2
,
2
},
{
0
,
1
,
1
,
2
},
{
0
,
1
,
1
,
2
},
{
0
,
0
,
1
,
1
},
{
0
,
0
,
1
,
1
},
{
0
,
0
,
0
,
1
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
3
,
3
,
4
,
4
},
{
3
,
3
,
4
,
4
},
{
2
,
3
,
3
,
4
},
{
2
,
3
,
3
,
4
},
{
2
,
2
,
3
,
3
},
{
2
,
2
,
3
,
3
},
{
1
,
2
,
2
,
3
},
{
1
,
2
,
2
,
3
},
{
1
,
1
,
2
,
2
},
{
1
,
1
,
2
,
2
},
{
0
,
1
,
1
,
2
},
{
0
,
1
,
1
,
2
},
{
0
,
0
,
1
,
1
},
{
0
,
0
,
1
,
1
},
{
0
,
0
,
0
,
1
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
};
const
uint8_t
ff_dv_quant_offset
[
4
]
=
{
6
,
3
,
0
,
1
};
const
uint8_t
ff_dv_quant_offset
[
4
]
=
{
6
,
3
,
0
,
1
};
const
int
ff_dv_iweight_88
[
64
]
=
{
32768
,
16710
,
16710
,
17735
,
17015
,
17735
,
18197
,
18079
,
18079
,
18197
,
18725
,
18559
,
19196
,
18559
,
18725
,
19284
,
19108
,
19692
,
19692
,
19108
,
19284
,
21400
,
19645
,
20262
,
20214
,
20262
,
19645
,
21400
,
22733
,
21845
,
20867
,
20815
,
20815
,
20867
,
21845
,
22733
,
23173
,
23173
,
21400
,
21400
,
21400
,
23173
,
23173
,
24600
,
23764
,
22017
,
22017
,
23764
,
24600
,
25267
,
24457
,
22672
,
24457
,
25267
,
25971
,
25191
,
25191
,
25971
,
26715
,
27962
,
26715
,
29642
,
29642
,
31536
,
32768
,
16710
,
16710
,
17735
,
17015
,
17735
,
18197
,
18079
,
18079
,
18197
,
18725
,
18559
,
19196
,
18559
,
18725
,
19284
,
19108
,
19692
,
19692
,
19108
,
19284
,
21400
,
19645
,
20262
,
20214
,
20262
,
19645
,
21400
,
22733
,
21845
,
20867
,
20815
,
20815
,
20867
,
21845
,
22733
,
23173
,
23173
,
21400
,
21400
,
21400
,
23173
,
23173
,
24600
,
23764
,
22017
,
22017
,
23764
,
24600
,
25267
,
24457
,
22672
,
24457
,
25267
,
25971
,
25191
,
25191
,
25971
,
26715
,
27962
,
26715
,
29642
,
29642
,
31536
,
};
const
int
ff_dv_iweight_248
[
64
]
=
{
32768
,
17735
,
16710
,
18079
,
18725
,
21400
,
17735
,
19196
,
19108
,
21845
,
16384
,
17735
,
18725
,
21400
,
16710
,
18079
,
20262
,
23173
,
18197
,
19692
,
18725
,
20262
,
20815
,
23764
,
17735
,
19196
,
19108
,
21845
,
20262
,
23173
,
18197
,
19692
,
21400
,
24457
,
19284
,
20867
,
21400
,
23173
,
22017
,
25191
,
18725
,
20262
,
20815
,
23764
,
21400
,
24457
,
19284
,
20867
,
24457
,
27962
,
22733
,
24600
,
25971
,
29642
,
21400
,
23173
,
22017
,
25191
,
24457
,
27962
,
22733
,
24600
,
25971
,
29642
,
32768
,
17735
,
16710
,
18079
,
18725
,
21400
,
17735
,
19196
,
19108
,
21845
,
16384
,
17735
,
18725
,
21400
,
16710
,
18079
,
20262
,
23173
,
18197
,
19692
,
18725
,
20262
,
20815
,
23764
,
17735
,
19196
,
19108
,
21845
,
20262
,
23173
,
18197
,
19692
,
21400
,
24457
,
19284
,
20867
,
21400
,
23173
,
22017
,
25191
,
18725
,
20262
,
20815
,
23764
,
21400
,
24457
,
19284
,
20867
,
24457
,
27962
,
22733
,
24600
,
25971
,
29642
,
21400
,
23173
,
22017
,
25191
,
24457
,
27962
,
22733
,
24600
,
25971
,
29642
,
};
/**
...
...
@@ -140,221 +140,221 @@ const int ff_dv_iweight_720_c[64] = {
* when building misc. tables. E.g. (1, 0) can be either 0x7cf or 0x1f82.
*/
const
uint16_t
ff_dv_vlc_bits
[
NB_DV_VLC
]
=
{
0x0000
,
0x0002
,
0x0007
,
0x0008
,
0x0009
,
0x0014
,
0x0015
,
0x0016
,
0x0017
,
0x0030
,
0x0031
,
0x0032
,
0x0033
,
0x0068
,
0x0069
,
0x006a
,
0x006b
,
0x006c
,
0x006d
,
0x006e
,
0x006f
,
0x00e0
,
0x00e1
,
0x00e2
,
0x00e3
,
0x00e4
,
0x00e5
,
0x00e6
,
0x00e7
,
0x00e8
,
0x00e9
,
0x00ea
,
0x00eb
,
0x00ec
,
0x00ed
,
0x00ee
,
0x00ef
,
0x01e0
,
0x01e1
,
0x01e2
,
0x01e3
,
0x01e4
,
0x01e5
,
0x01e6
,
0x01e7
,
0x01e8
,
0x01e9
,
0x01ea
,
0x01eb
,
0x01ec
,
0x01ed
,
0x01ee
,
0x01ef
,
0x03e0
,
0x03e1
,
0x03e2
,
0x03e3
,
0x03e4
,
0x03e5
,
0x03e6
,
0x07ce
,
0x07cf
,
0x07d0
,
0x07d1
,
0x07d2
,
0x07d3
,
0x07d4
,
0x07d5
,
0x0fac
,
0x0fad
,
0x0fae
,
0x0faf
,
0x0fb0
,
0x0fb1
,
0x0fb2
,
0x0fb3
,
0x0fb4
,
0x0fb5
,
0x0fb6
,
0x0fb7
,
0x0fb8
,
0x0fb9
,
0x0fba
,
0x0fbb
,
0x0fbc
,
0x0fbd
,
0x0fbe
,
0x0fbf
,
0x1f80
,
0x1f81
,
0x1f82
,
0x1f83
,
0x1f84
,
0x1f85
,
0x1f86
,
0x1f87
,
0x1f88
,
0x1f89
,
0x1f8a
,
0x1f8b
,
0x1f8c
,
0x1f8d
,
0x1f8e
,
0x1f8f
,
0x1f90
,
0x1f91
,
0x1f92
,
0x1f93
,
0x1f94
,
0x1f95
,
0x1f96
,
0x1f97
,
0x1f98
,
0x1f99
,
0x1f9a
,
0x1f9b
,
0x1f9c
,
0x1f9d
,
0x1f9e
,
0x1f9f
,
0x1fa0
,
0x1fa1
,
0x1fa2
,
0x1fa3
,
0x1fa4
,
0x1fa5
,
0x1fa6
,
0x1fa7
,
0x1fa8
,
0x1fa9
,
0x1faa
,
0x1fab
,
0x1fac
,
0x1fad
,
0x1fae
,
0x1faf
,
0x1fb0
,
0x1fb1
,
0x1fb2
,
0x1fb3
,
0x1fb4
,
0x1fb5
,
0x1fb6
,
0x1fb7
,
0x1fb8
,
0x1fb9
,
0x1fba
,
0x1fbb
,
0x1fbc
,
0x1fbd
,
0x1fbe
,
0x1fbf
,
0x7f00
,
0x7f01
,
0x7f02
,
0x7f03
,
0x7f04
,
0x7f05
,
0x7f06
,
0x7f07
,
0x7f08
,
0x7f09
,
0x7f0a
,
0x7f0b
,
0x7f0c
,
0x7f0d
,
0x7f0e
,
0x7f0f
,
0x7f10
,
0x7f11
,
0x7f12
,
0x7f13
,
0x7f14
,
0x7f15
,
0x7f16
,
0x7f17
,
0x7f18
,
0x7f19
,
0x7f1a
,
0x7f1b
,
0x7f1c
,
0x7f1d
,
0x7f1e
,
0x7f1f
,
0x7f20
,
0x7f21
,
0x7f22
,
0x7f23
,
0x7f24
,
0x7f25
,
0x7f26
,
0x7f27
,
0x7f28
,
0x7f29
,
0x7f2a
,
0x7f2b
,
0x7f2c
,
0x7f2d
,
0x7f2e
,
0x7f2f
,
0x7f30
,
0x7f31
,
0x7f32
,
0x7f33
,
0x7f34
,
0x7f35
,
0x7f36
,
0x7f37
,
0x7f38
,
0x7f39
,
0x7f3a
,
0x7f3b
,
0x7f3c
,
0x7f3d
,
0x7f3e
,
0x7f3f
,
0x7f40
,
0x7f41
,
0x7f42
,
0x7f43
,
0x7f44
,
0x7f45
,
0x7f46
,
0x7f47
,
0x7f48
,
0x7f49
,
0x7f4a
,
0x7f4b
,
0x7f4c
,
0x7f4d
,
0x7f4e
,
0x7f4f
,
0x7f50
,
0x7f51
,
0x7f52
,
0x7f53
,
0x7f54
,
0x7f55
,
0x7f56
,
0x7f57
,
0x7f58
,
0x7f59
,
0x7f5a
,
0x7f5b
,
0x7f5c
,
0x7f5d
,
0x7f5e
,
0x7f5f
,
0x7f60
,
0x7f61
,
0x7f62
,
0x7f63
,
0x7f64
,
0x7f65
,
0x7f66
,
0x7f67
,
0x7f68
,
0x7f69
,
0x7f6a
,
0x7f6b
,
0x7f6c
,
0x7f6d
,
0x7f6e
,
0x7f6f
,
0x7f70
,
0x7f71
,
0x7f72
,
0x7f73
,
0x7f74
,
0x7f75
,
0x7f76
,
0x7f77
,
0x7f78
,
0x7f79
,
0x7f7a
,
0x7f7b
,
0x7f7c
,
0x7f7d
,
0x7f7e
,
0x7f7f
,
0x7f80
,
0x7f81
,
0x7f82
,
0x7f83
,
0x7f84
,
0x7f85
,
0x7f86
,
0x7f87
,
0x7f88
,
0x7f89
,
0x7f8a
,
0x7f8b
,
0x7f8c
,
0x7f8d
,
0x7f8e
,
0x7f8f
,
0x7f90
,
0x7f91
,
0x7f92
,
0x7f93
,
0x7f94
,
0x7f95
,
0x7f96
,
0x7f97
,
0x7f98
,
0x7f99
,
0x7f9a
,
0x7f9b
,
0x7f9c
,
0x7f9d
,
0x7f9e
,
0x7f9f
,
0x7fa0
,
0x7fa1
,
0x7fa2
,
0x7fa3
,
0x7fa4
,
0x7fa5
,
0x7fa6
,
0x7fa7
,
0x7fa8
,
0x7fa9
,
0x7faa
,
0x7fab
,
0x7fac
,
0x7fad
,
0x7fae
,
0x7faf
,
0x7fb0
,
0x7fb1
,
0x7fb2
,
0x7fb3
,
0x7fb4
,
0x7fb5
,
0x7fb6
,
0x7fb7
,
0x7fb8
,
0x7fb9
,
0x7fba
,
0x7fbb
,
0x7fbc
,
0x7fbd
,
0x7fbe
,
0x7fbf
,
0x7fc0
,
0x7fc1
,
0x7fc2
,
0x7fc3
,
0x7fc4
,
0x7fc5
,
0x7fc6
,
0x7fc7
,
0x7fc8
,
0x7fc9
,
0x7fca
,
0x7fcb
,
0x7fcc
,
0x7fcd
,
0x7fce
,
0x7fcf
,
0x7fd0
,
0x7fd1
,
0x7fd2
,
0x7fd3
,
0x7fd4
,
0x7fd5
,
0x7fd6
,
0x7fd7
,
0x7fd8
,
0x7fd9
,
0x7fda
,
0x7fdb
,
0x7fdc
,
0x7fdd
,
0x7fde
,
0x7fdf
,
0x7fe0
,
0x7fe1
,
0x7fe2
,
0x7fe3
,
0x7fe4
,
0x7fe5
,
0x7fe6
,
0x7fe7
,
0x7fe8
,
0x7fe9
,
0x7fea
,
0x7feb
,
0x7fec
,
0x7fed
,
0x7fee
,
0x7fef
,
0x7ff0
,
0x7ff1
,
0x7ff2
,
0x7ff3
,
0x7ff4
,
0x7ff5
,
0x7ff6
,
0x7ff7
,
0x7ff8
,
0x7ff9
,
0x7ffa
,
0x7ffb
,
0x7ffc
,
0x7ffd
,
0x7ffe
,
0x7fff
,
0x0006
,
0x0000
,
0x0002
,
0x0007
,
0x0008
,
0x0009
,
0x0014
,
0x0015
,
0x0016
,
0x0017
,
0x0030
,
0x0031
,
0x0032
,
0x0033
,
0x0068
,
0x0069
,
0x006a
,
0x006b
,
0x006c
,
0x006d
,
0x006e
,
0x006f
,
0x00e0
,
0x00e1
,
0x00e2
,
0x00e3
,
0x00e4
,
0x00e5
,
0x00e6
,
0x00e7
,
0x00e8
,
0x00e9
,
0x00ea
,
0x00eb
,
0x00ec
,
0x00ed
,
0x00ee
,
0x00ef
,
0x01e0
,
0x01e1
,
0x01e2
,
0x01e3
,
0x01e4
,
0x01e5
,
0x01e6
,
0x01e7
,
0x01e8
,
0x01e9
,
0x01ea
,
0x01eb
,
0x01ec
,
0x01ed
,
0x01ee
,
0x01ef
,
0x03e0
,
0x03e1
,
0x03e2
,
0x03e3
,
0x03e4
,
0x03e5
,
0x03e6
,
0x07ce
,
0x07cf
,
0x07d0
,
0x07d1
,
0x07d2
,
0x07d3
,
0x07d4
,
0x07d5
,
0x0fac
,
0x0fad
,
0x0fae
,
0x0faf
,
0x0fb0
,
0x0fb1
,
0x0fb2
,
0x0fb3
,
0x0fb4
,
0x0fb5
,
0x0fb6
,
0x0fb7
,
0x0fb8
,
0x0fb9
,
0x0fba
,
0x0fbb
,
0x0fbc
,
0x0fbd
,
0x0fbe
,
0x0fbf
,
0x1f80
,
0x1f81
,
0x1f82
,
0x1f83
,
0x1f84
,
0x1f85
,
0x1f86
,
0x1f87
,
0x1f88
,
0x1f89
,
0x1f8a
,
0x1f8b
,
0x1f8c
,
0x1f8d
,
0x1f8e
,
0x1f8f
,
0x1f90
,
0x1f91
,
0x1f92
,
0x1f93
,
0x1f94
,
0x1f95
,
0x1f96
,
0x1f97
,
0x1f98
,
0x1f99
,
0x1f9a
,
0x1f9b
,
0x1f9c
,
0x1f9d
,
0x1f9e
,
0x1f9f
,
0x1fa0
,
0x1fa1
,
0x1fa2
,
0x1fa3
,
0x1fa4
,
0x1fa5
,
0x1fa6
,
0x1fa7
,
0x1fa8
,
0x1fa9
,
0x1faa
,
0x1fab
,
0x1fac
,
0x1fad
,
0x1fae
,
0x1faf
,
0x1fb0
,
0x1fb1
,
0x1fb2
,
0x1fb3
,
0x1fb4
,
0x1fb5
,
0x1fb6
,
0x1fb7
,
0x1fb8
,
0x1fb9
,
0x1fba
,
0x1fbb
,
0x1fbc
,
0x1fbd
,
0x1fbe
,
0x1fbf
,
0x7f00
,
0x7f01
,
0x7f02
,
0x7f03
,
0x7f04
,
0x7f05
,
0x7f06
,
0x7f07
,
0x7f08
,
0x7f09
,
0x7f0a
,
0x7f0b
,
0x7f0c
,
0x7f0d
,
0x7f0e
,
0x7f0f
,
0x7f10
,
0x7f11
,
0x7f12
,
0x7f13
,
0x7f14
,
0x7f15
,
0x7f16
,
0x7f17
,
0x7f18
,
0x7f19
,
0x7f1a
,
0x7f1b
,
0x7f1c
,
0x7f1d
,
0x7f1e
,
0x7f1f
,
0x7f20
,
0x7f21
,
0x7f22
,
0x7f23
,
0x7f24
,
0x7f25
,
0x7f26
,
0x7f27
,
0x7f28
,
0x7f29
,
0x7f2a
,
0x7f2b
,
0x7f2c
,
0x7f2d
,
0x7f2e
,
0x7f2f
,
0x7f30
,
0x7f31
,
0x7f32
,
0x7f33
,
0x7f34
,
0x7f35
,
0x7f36
,
0x7f37
,
0x7f38
,
0x7f39
,
0x7f3a
,
0x7f3b
,
0x7f3c
,
0x7f3d
,
0x7f3e
,
0x7f3f
,
0x7f40
,
0x7f41
,
0x7f42
,
0x7f43
,
0x7f44
,
0x7f45
,
0x7f46
,
0x7f47
,
0x7f48
,
0x7f49
,
0x7f4a
,
0x7f4b
,
0x7f4c
,
0x7f4d
,
0x7f4e
,
0x7f4f
,
0x7f50
,
0x7f51
,
0x7f52
,
0x7f53
,
0x7f54
,
0x7f55
,
0x7f56
,
0x7f57
,
0x7f58
,
0x7f59
,
0x7f5a
,
0x7f5b
,
0x7f5c
,
0x7f5d
,
0x7f5e
,
0x7f5f
,
0x7f60
,
0x7f61
,
0x7f62
,
0x7f63
,
0x7f64
,
0x7f65
,
0x7f66
,
0x7f67
,
0x7f68
,
0x7f69
,
0x7f6a
,
0x7f6b
,
0x7f6c
,
0x7f6d
,
0x7f6e
,
0x7f6f
,
0x7f70
,
0x7f71
,
0x7f72
,
0x7f73
,
0x7f74
,
0x7f75
,
0x7f76
,
0x7f77
,
0x7f78
,
0x7f79
,
0x7f7a
,
0x7f7b
,
0x7f7c
,
0x7f7d
,
0x7f7e
,
0x7f7f
,
0x7f80
,
0x7f81
,
0x7f82
,
0x7f83
,
0x7f84
,
0x7f85
,
0x7f86
,
0x7f87
,
0x7f88
,
0x7f89
,
0x7f8a
,
0x7f8b
,
0x7f8c
,
0x7f8d
,
0x7f8e
,
0x7f8f
,
0x7f90
,
0x7f91
,
0x7f92
,
0x7f93
,
0x7f94
,
0x7f95
,
0x7f96
,
0x7f97
,
0x7f98
,
0x7f99
,
0x7f9a
,
0x7f9b
,
0x7f9c
,
0x7f9d
,
0x7f9e
,
0x7f9f
,
0x7fa0
,
0x7fa1
,
0x7fa2
,
0x7fa3
,
0x7fa4
,
0x7fa5
,
0x7fa6
,
0x7fa7
,
0x7fa8
,
0x7fa9
,
0x7faa
,
0x7fab
,
0x7fac
,
0x7fad
,
0x7fae
,
0x7faf
,
0x7fb0
,
0x7fb1
,
0x7fb2
,
0x7fb3
,
0x7fb4
,
0x7fb5
,
0x7fb6
,
0x7fb7
,
0x7fb8
,
0x7fb9
,
0x7fba
,
0x7fbb
,
0x7fbc
,
0x7fbd
,
0x7fbe
,
0x7fbf
,
0x7fc0
,
0x7fc1
,
0x7fc2
,
0x7fc3
,
0x7fc4
,
0x7fc5
,
0x7fc6
,
0x7fc7
,
0x7fc8
,
0x7fc9
,
0x7fca
,
0x7fcb
,
0x7fcc
,
0x7fcd
,
0x7fce
,
0x7fcf
,
0x7fd0
,
0x7fd1
,
0x7fd2
,
0x7fd3
,
0x7fd4
,
0x7fd5
,
0x7fd6
,
0x7fd7
,
0x7fd8
,
0x7fd9
,
0x7fda
,
0x7fdb
,
0x7fdc
,
0x7fdd
,
0x7fde
,
0x7fdf
,
0x7fe0
,
0x7fe1
,
0x7fe2
,
0x7fe3
,
0x7fe4
,
0x7fe5
,
0x7fe6
,
0x7fe7
,
0x7fe8
,
0x7fe9
,
0x7fea
,
0x7feb
,
0x7fec
,
0x7fed
,
0x7fee
,
0x7fef
,
0x7ff0
,
0x7ff1
,
0x7ff2
,
0x7ff3
,
0x7ff4
,
0x7ff5
,
0x7ff6
,
0x7ff7
,
0x7ff8
,
0x7ff9
,
0x7ffa
,
0x7ffb
,
0x7ffc
,
0x7ffd
,
0x7ffe
,
0x7fff
,
0x0006
,
};
const
uint8_t
ff_dv_vlc_len
[
NB_DV_VLC
]
=
{
2
,
3
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
10
,
10
,
10
,
10
,
10
,
10
,
10
,
11
,
11
,
11
,
11
,
11
,
11
,
11
,
11
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
4
,
2
,
3
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
9
,
10
,
10
,
10
,
10
,
10
,
10
,
10
,
11
,
11
,
11
,
11
,
11
,
11
,
11
,
11
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
12
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
13
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
15
,
4
,
};
const
uint8_t
ff_dv_vlc_run
[
NB_DV_VLC
]
=
{
0
,
0
,
1
,
0
,
0
,
2
,
1
,
0
,
0
,
3
,
4
,
0
,
0
,
5
,
6
,
2
,
1
,
1
,
0
,
0
,
0
,
7
,
8
,
9
,
10
,
3
,
4
,
2
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
11
,
12
,
13
,
14
,
5
,
6
,
3
,
4
,
2
,
2
,
1
,
0
,
0
,
0
,
0
,
0
,
5
,
3
,
3
,
2
,
1
,
1
,
1
,
0
,
1
,
6
,
4
,
3
,
1
,
1
,
1
,
2
,
3
,
4
,
5
,
7
,
8
,
9
,
10
,
7
,
8
,
4
,
3
,
2
,
2
,
2
,
2
,
2
,
1
,
1
,
1
,
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
28
,
29
,
30
,
31
,
32
,
33
,
34
,
35
,
36
,
37
,
38
,
39
,
40
,
41
,
42
,
43
,
44
,
45
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
53
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
127
,
0
,
0
,
1
,
0
,
0
,
2
,
1
,
0
,
0
,
3
,
4
,
0
,
0
,
5
,
6
,
2
,
1
,
1
,
0
,
0
,
0
,
7
,
8
,
9
,
10
,
3
,
4
,
2
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
11
,
12
,
13
,
14
,
5
,
6
,
3
,
4
,
2
,
2
,
1
,
0
,
0
,
0
,
0
,
0
,
5
,
3
,
3
,
2
,
1
,
1
,
1
,
0
,
1
,
6
,
4
,
3
,
1
,
1
,
1
,
2
,
3
,
4
,
5
,
7
,
8
,
9
,
10
,
7
,
8
,
4
,
3
,
2
,
2
,
2
,
2
,
2
,
1
,
1
,
1
,
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
28
,
29
,
30
,
31
,
32
,
33
,
34
,
35
,
36
,
37
,
38
,
39
,
40
,
41
,
42
,
43
,
44
,
45
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
53
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
127
,
};
const
uint8_t
ff_dv_vlc_level
[
NB_DV_VLC
]
=
{
1
,
2
,
1
,
3
,
4
,
1
,
2
,
5
,
6
,
1
,
1
,
7
,
8
,
1
,
1
,
2
,
3
,
4
,
9
,
10
,
11
,
1
,
1
,
1
,
1
,
2
,
2
,
3
,
5
,
6
,
7
,
12
,
13
,
14
,
15
,
16
,
17
,
1
,
1
,
1
,
1
,
2
,
2
,
3
,
3
,
4
,
5
,
8
,
18
,
19
,
20
,
21
,
22
,
3
,
4
,
5
,
6
,
9
,
10
,
11
,
0
,
0
,
3
,
4
,
6
,
12
,
13
,
14
,
0
,
0
,
0
,
0
,
2
,
2
,
2
,
2
,
3
,
3
,
5
,
7
,
7
,
8
,
9
,
10
,
11
,
15
,
16
,
17
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
28
,
29
,
30
,
31
,
32
,
33
,
34
,
35
,
36
,
37
,
38
,
39
,
40
,
41
,
42
,
43
,
44
,
45
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
53
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
64
,
65
,
66
,
67
,
68
,
69
,
70
,
71
,
72
,
73
,
74
,
75
,
76
,
77
,
78
,
79
,
80
,
81
,
82
,
83
,
84
,
85
,
86
,
87
,
88
,
89
,
90
,
91
,
92
,
93
,
94
,
95
,
96
,
97
,
98
,
99
,
100
,
101
,
102
,
103
,
104
,
105
,
106
,
107
,
108
,
109
,
110
,
111
,
112
,
113
,
114
,
115
,
116
,
117
,
118
,
119
,
120
,
121
,
122
,
123
,
124
,
125
,
126
,
127
,
128
,
129
,
130
,
131
,
132
,
133
,
134
,
135
,
136
,
137
,
138
,
139
,
140
,
141
,
142
,
143
,
144
,
145
,
146
,
147
,
148
,
149
,
150
,
151
,
152
,
153
,
154
,
155
,
156
,
157
,
158
,
159
,
160
,
161
,
162
,
163
,
164
,
165
,
166
,
167
,
168
,
169
,
170
,
171
,
172
,
173
,
174
,
175
,
176
,
177
,
178
,
179
,
180
,
181
,
182
,
183
,
184
,
185
,
186
,
187
,
188
,
189
,
190
,
191
,
192
,
193
,
194
,
195
,
196
,
197
,
198
,
199
,
200
,
201
,
202
,
203
,
204
,
205
,
206
,
207
,
208
,
209
,
210
,
211
,
212
,
213
,
214
,
215
,
216
,
217
,
218
,
219
,
220
,
221
,
222
,
223
,
224
,
225
,
226
,
227
,
228
,
229
,
230
,
231
,
232
,
233
,
234
,
235
,
236
,
237
,
238
,
239
,
240
,
241
,
242
,
243
,
244
,
245
,
246
,
247
,
248
,
249
,
250
,
251
,
252
,
253
,
254
,
255
,
0
,
1
,
2
,
1
,
3
,
4
,
1
,
2
,
5
,
6
,
1
,
1
,
7
,
8
,
1
,
1
,
2
,
3
,
4
,
9
,
10
,
11
,
1
,
1
,
1
,
1
,
2
,
2
,
3
,
5
,
6
,
7
,
12
,
13
,
14
,
15
,
16
,
17
,
1
,
1
,
1
,
1
,
2
,
2
,
3
,
3
,
4
,
5
,
8
,
18
,
19
,
20
,
21
,
22
,
3
,
4
,
5
,
6
,
9
,
10
,
11
,
0
,
0
,
3
,
4
,
6
,
12
,
13
,
14
,
0
,
0
,
0
,
0
,
2
,
2
,
2
,
2
,
3
,
3
,
5
,
7
,
7
,
8
,
9
,
10
,
11
,
15
,
16
,
17
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
28
,
29
,
30
,
31
,
32
,
33
,
34
,
35
,
36
,
37
,
38
,
39
,
40
,
41
,
42
,
43
,
44
,
45
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
53
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
64
,
65
,
66
,
67
,
68
,
69
,
70
,
71
,
72
,
73
,
74
,
75
,
76
,
77
,
78
,
79
,
80
,
81
,
82
,
83
,
84
,
85
,
86
,
87
,
88
,
89
,
90
,
91
,
92
,
93
,
94
,
95
,
96
,
97
,
98
,
99
,
100
,
101
,
102
,
103
,
104
,
105
,
106
,
107
,
108
,
109
,
110
,
111
,
112
,
113
,
114
,
115
,
116
,
117
,
118
,
119
,
120
,
121
,
122
,
123
,
124
,
125
,
126
,
127
,
128
,
129
,
130
,
131
,
132
,
133
,
134
,
135
,
136
,
137
,
138
,
139
,
140
,
141
,
142
,
143
,
144
,
145
,
146
,
147
,
148
,
149
,
150
,
151
,
152
,
153
,
154
,
155
,
156
,
157
,
158
,
159
,
160
,
161
,
162
,
163
,
164
,
165
,
166
,
167
,
168
,
169
,
170
,
171
,
172
,
173
,
174
,
175
,
176
,
177
,
178
,
179
,
180
,
181
,
182
,
183
,
184
,
185
,
186
,
187
,
188
,
189
,
190
,
191
,
192
,
193
,
194
,
195
,
196
,
197
,
198
,
199
,
200
,
201
,
202
,
203
,
204
,
205
,
206
,
207
,
208
,
209
,
210
,
211
,
212
,
213
,
214
,
215
,
216
,
217
,
218
,
219
,
220
,
221
,
222
,
223
,
224
,
225
,
226
,
227
,
228
,
229
,
230
,
231
,
232
,
233
,
234
,
235
,
236
,
237
,
238
,
239
,
240
,
241
,
242
,
243
,
244
,
245
,
246
,
247
,
248
,
249
,
250
,
251
,
252
,
253
,
254
,
255
,
0
,
};
libavcodec/dvdec.c
View file @
ee0ebd3c
...
...
@@ -35,17 +35,18 @@
* DV decoder
*/
#include "libavutil/internal.h"
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "dv.h"
#include "dvdata.h"
#include "get_bits.h"
#include "idctdsp.h"
#include "internal.h"
#include "get_bits.h"
#include "put_bits.h"
#include "simple_idct.h"
#include "dvdata.h"
#include "dv.h"
typedef
struct
BlockInfo
{
const
uint32_t
*
factor_table
;
...
...
@@ -68,7 +69,7 @@ static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
ff_idctdsp_init
(
&
idsp
,
avctx
);
for
(
i
=
0
;
i
<
64
;
i
++
)
s
->
dv_zigzag
[
0
][
i
]
=
idsp
.
idct_permutation
[
ff_zigzag_direct
[
i
]];
s
->
dv_zigzag
[
0
][
i
]
=
idsp
.
idct_permutation
[
ff_zigzag_direct
[
i
]];
memcpy
(
s
->
dv_zigzag
[
1
],
ff_dv_zigzag248_direct
,
sizeof
(
s
->
dv_zigzag
[
1
]));
...
...
@@ -84,8 +85,8 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
int
last_index
=
gb
->
size_in_bits
;
const
uint8_t
*
scan_table
=
mb
->
scan_table
;
const
uint32_t
*
factor_table
=
mb
->
factor_table
;
int
pos
=
mb
->
pos
;
int
partial_bit_count
=
mb
->
partial_bit_count
;
int
pos
=
mb
->
pos
;
int
partial_bit_count
=
mb
->
partial_bit_count
;
int
level
,
run
,
vlc_len
,
index
;
OPEN_READER_NOSIZE
(
re
,
gb
);
...
...
@@ -93,8 +94,9 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
/* if we must parse a partial VLC, we do it here */
if
(
partial_bit_count
>
0
)
{
re_cache
=
re_cache
>>
partial_bit_count
|
mb
->
partial_bit_buffer
;
re_index
-=
partial_bit_count
;
re_cache
=
re_cache
>>
partial_bit_count
|
mb
->
partial_bit_buffer
;
re_index
-=
partial_bit_count
;
mb
->
partial_bit_count
=
0
;
}
...
...
@@ -106,7 +108,7 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
index
=
NEG_USR32
(
re_cache
,
TEX_VLC_BITS
);
vlc_len
=
ff_dv_rl_vlc
[
index
].
len
;
if
(
vlc_len
<
0
)
{
index
=
NEG_USR32
((
unsigned
)
re_cache
<<
TEX_VLC_BITS
,
-
vlc_len
)
+
index
=
NEG_USR32
((
unsigned
)
re_cache
<<
TEX_VLC_BITS
,
-
vlc_len
)
+
ff_dv_rl_vlc
[
index
].
level
;
vlc_len
=
TEX_VLC_BITS
-
vlc_len
;
}
...
...
@@ -116,9 +118,9 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
/* gotta check if we're still within gb boundaries */
if
(
re_index
+
vlc_len
>
last_index
)
{
/* should be < 16 bits otherwise a codeword could have been parsed */
mb
->
partial_bit_count
=
last_index
-
re_index
;
mb
->
partial_bit_count
=
last_index
-
re_index
;
mb
->
partial_bit_buffer
=
re_cache
&
~
(
-
1u
>>
mb
->
partial_bit_count
);
re_index
=
last_index
;
re_index
=
last_index
;
break
;
}
re_index
+=
vlc_len
;
...
...
@@ -128,7 +130,8 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *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
);
...
...
@@ -144,9 +147,8 @@ static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
put_bits
(
pb
,
MIN_CACHE_BITS
,
get_bits
(
gb
,
MIN_CACHE_BITS
));
bits_left
-=
MIN_CACHE_BITS
;
}
if
(
bits_left
>
0
)
{
if
(
bits_left
>
0
)
put_bits
(
pb
,
bits_left
,
get_bits
(
gb
,
bits_left
));
}
}
/* mb_x and mb_y are in units of 8 pixels */
...
...
@@ -164,25 +166,25 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
PutBitContext
pb
,
vs_pb
;
GetBitContext
gb
;
BlockInfo
mb_data
[
5
*
DV_MAX_BPM
],
*
mb
,
*
mb1
;
LOCAL_ALIGNED_16
(
int16_t
,
sblock
,
[
5
*
DV_MAX_BPM
],
[
64
]);
LOCAL_ALIGNED_16
(
uint8_t
,
mb_bit_buffer
,
[
80
+
FF_INPUT_BUFFER_PADDING_SIZE
]);
/* allow some slack */
LOCAL_ALIGNED_16
(
uint8_t
,
vs_bit_buffer
,
[
5
*
80
+
FF_INPUT_BUFFER_PADDING_SIZE
]);
/* allow some slack */
LOCAL_ALIGNED_16
(
int16_t
,
sblock
,
[
5
*
DV_MAX_BPM
],
[
64
]);
LOCAL_ALIGNED_16
(
uint8_t
,
mb_bit_buffer
,
[
80
+
FF_INPUT_BUFFER_PADDING_SIZE
]);
/* allow some slack */
LOCAL_ALIGNED_16
(
uint8_t
,
vs_bit_buffer
,
[
80
*
5
+
FF_INPUT_BUFFER_PADDING_SIZE
]);
/* allow some slack */
const
int
log2_blocksize
=
3
;
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
,
5
*
DV_MAX_BPM
*
sizeof
(
*
sblock
));
memset
(
sblock
,
0
,
5
*
DV_MAX_BPM
*
sizeof
(
*
sblock
));
/* pass 1: read DC and AC coefficients in blocks */
buf_ptr
=
&
s
->
buf
[
work_chunk
->
buf_offset
*
80
];
buf_ptr
=
&
s
->
buf
[
work_chunk
->
buf_offset
*
80
];
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
)
{
/* skip header */
quant
=
buf_ptr
[
3
]
&
0x0f
;
quant
=
buf_ptr
[
3
]
&
0x0f
;
buf_ptr
+=
4
;
init_put_bits
(
&
pb
,
mb_bit_buffer
,
80
);
mb
=
mb1
;
...
...
@@ -199,20 +201,24 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
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
->
idct_factor
[(
j
>=
4
)
*
4
*
16
*
64
+
class1
*
16
*
64
+
quant
*
64
];
mb
->
factor_table
=
&
s
->
idct_factor
[(
j
>=
4
)
*
4
*
16
*
64
+
class1
*
16
*
64
+
quant
*
64
];
is_field_mode
[
mb_index
]
|=
!
j
&&
dct_mode
;
}
else
{
mb
->
idct_put
=
s
->
idct_put
[
dct_mode
&&
log2_blocksize
==
3
];
mb
->
scan_table
=
s
->
dv_zigzag
[
dct_mode
];
mb
->
factor_table
=
&
s
->
idct_factor
[(
class1
==
3
)
*
2
*
22
*
64
+
dct_mode
*
22
*
64
+
(
quant
+
ff_dv_quant_offset
[
class1
])
*
64
];
mb
->
factor_table
=
&
s
->
idct_factor
[(
class1
==
3
)
*
2
*
22
*
64
+
dct_mode
*
22
*
64
+
(
quant
+
ff_dv_quant_offset
[
class1
])
*
64
];
}
dc
=
dc
<<
2
;
/* convert to unsigned because 128 is not added in the
standard IDCT */
dc
+=
1024
;
block
[
0
]
=
dc
;
buf_ptr
+=
last_index
>>
3
;
*
standard IDCT */
dc
+=
1024
;
block
[
0
]
=
dc
;
buf_ptr
+=
last_index
>>
3
;
mb
->
pos
=
0
;
mb
->
partial_bit_count
=
0
;
...
...
@@ -220,7 +226,7 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
dv_decode_ac
(
&
gb
,
mb
,
block
);
/* write the remaining bits in a new buffer only if the
block is finished */
*
block is finished */
if
(
mb
->
pos
>=
64
)
bit_copy
(
&
pb
,
&
gb
);
...
...
@@ -244,7 +250,7 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
}
}
/* all blocks are finished, so the extra bytes can be used at
the video segment level */
*
the video segment level */
if
(
j
>=
s
->
sys
->
bpm
)
bit_copy
(
&
vs_pb
,
&
gb
);
}
...
...
@@ -263,7 +269,8 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
dv_decode_ac
(
&
gb
,
mb
,
block
);
}
if
(
mb
->
pos
>=
64
&&
mb
->
pos
<
127
)
av_log
(
avctx
,
AV_LOG_ERROR
,
"AC EOB marker is absent pos=%d
\n
"
,
mb
->
pos
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"AC EOB marker is absent pos=%d
\n
"
,
mb
->
pos
);
block
+=
64
;
mb
++
;
}
...
...
@@ -276,25 +283,27 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
dv_calculate_mb_xy
(
s
,
work_chunk
,
mb_index
,
&
mb_x
,
&
mb_y
);
/* idct_put'ting luminance */
if
((
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
)
||
if
((
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
)
||
(
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
||
(
s
->
sys
->
height
>=
720
&&
mb_y
!=
134
))
{
y_stride
=
(
s
->
frame
->
linesize
[
0
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
));
y_stride
=
(
s
->
frame
->
linesize
[
0
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
));
}
else
{
y_stride
=
(
2
<<
log2_blocksize
);
}
y_ptr
=
s
->
frame
->
data
[
0
]
+
((
mb_y
*
s
->
frame
->
linesize
[
0
]
+
mb_x
)
<<
log2_blocksize
);
y_ptr
=
s
->
frame
->
data
[
0
]
+
((
mb_y
*
s
->
frame
->
linesize
[
0
]
+
mb_x
)
<<
log2_blocksize
);
linesize
=
s
->
frame
->
linesize
[
0
]
<<
is_field_mode
[
mb_index
];
mb
[
0
]
.
idct_put
(
y_ptr
,
linesize
,
block
+
0
*
64
);
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
[
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
[
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
+=
4
;
block
+=
4
*
64
;
mb
+=
4
;
block
+=
4
*
64
;
/* idct_put'ting chrominance */
c_offset
=
(((
mb_y
>>
(
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
))
*
s
->
frame
->
linesize
[
1
]
+
...
...
@@ -302,28 +311,31 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
for
(
j
=
2
;
j
;
j
--
)
{
uint8_t
*
c_ptr
=
s
->
frame
->
data
[
j
]
+
c_offset
;
if
(
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
{
uint64_t
aligned_pixels
[
64
/
8
];
uint8_t
*
pixels
=
(
uint8_t
*
)
aligned_pixels
;
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
->
frame
->
linesize
[
j
],
pixels
+=
8
)
{
ptr1
=
pixels
+
(
1
<<
(
log2_blocksize
-
1
));
c_ptr1
=
c_ptr
+
(
s
->
frame
->
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
++
;
uint64_t
aligned_pixels
[
64
/
8
];
uint8_t
*
pixels
=
(
uint8_t
*
)
aligned_pixels
;
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
->
frame
->
linesize
[
j
],
pixels
+=
8
)
{
ptr1
=
pixels
+
(
1
<<
(
log2_blocksize
-
1
));
c_ptr1
=
c_ptr
+
(
s
->
frame
->
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
->
frame
->
linesize
[
j
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
);
linesize
=
s
->
frame
->
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
;
}
y_stride
=
(
mb_y
==
134
)
?
(
1
<<
log2_blocksize
)
:
s
->
frame
->
linesize
[
j
]
<<
((
!
is_field_mode
[
mb_index
])
*
log2_blocksize
);
linesize
=
s
->
frame
->
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
;
}
}
}
}
...
...
@@ -331,15 +343,14 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
}
/* NOTE: exactly one frame must be given (120000 bytes for NTSC,
144000 bytes for PAL - or twice those for 50Mbps) */
static
int
dvvideo_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
* 144000 bytes for PAL - or twice those for 50Mbps) */
static
int
dvvideo_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
;
DVVideoContext
*
s
=
avctx
->
priv_data
;
const
uint8_t
*
vsc_pack
;
const
uint8_t
*
vsc_pack
;
int
apt
,
is16_9
,
ret
;
const
AVDVProfile
*
sys
;
...
...
@@ -361,18 +372,19 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
s
->
frame
=
data
;
s
->
frame
->
key_frame
=
1
;
s
->
frame
->
pict_type
=
AV_PICTURE_TYPE_I
;
avctx
->
pix_fmt
=
s
->
sys
->
pix_fmt
;
avctx
->
time_base
=
s
->
sys
->
time_base
;
avctx
->
pix_fmt
=
s
->
sys
->
pix_fmt
;
avctx
->
time_base
=
s
->
sys
->
time_base
;
ret
=
ff_set_dimensions
(
avctx
,
s
->
sys
->
width
,
s
->
sys
->
height
);
if
(
ret
<
0
)
return
ret
;
/* Determine the codec's sample_aspect ratio from the packet */
vsc_pack
=
buf
+
80
*
5
+
48
+
5
;
if
(
*
vsc_pack
==
dv_video_control
)
{
apt
=
buf
[
4
]
&
0x07
;
is16_9
=
(
vsc_pack
&&
((
vsc_pack
[
2
]
&
0x07
)
==
0x02
||
(
!
apt
&&
(
vsc_pack
[
2
]
&
0x07
)
==
0x07
)));
vsc_pack
=
buf
+
80
*
5
+
48
+
5
;
if
(
*
vsc_pack
==
dv_video_control
)
{
apt
=
buf
[
4
]
&
0x07
;
is16_9
=
(
vsc_pack
&&
((
vsc_pack
[
2
]
&
0x07
)
==
0x02
||
(
!
apt
&&
(
vsc_pack
[
2
]
&
0x07
)
==
0x07
)));
ff_set_sar
(
avctx
,
s
->
sys
->
sar
[
is16_9
]);
}
...
...
libavcodec/dvenc.c
View file @
ee0ebd3c
...
...
@@ -24,18 +24,20 @@
* DV encoder
*/
#include "config.h"
#include "libavutil/attributes.h"
#include "libavutil/pixdesc.h"
#include "config.h"
#include "avcodec.h"
#include "dv.h"
#include "dv_profile_internal.h"
#include "dv_tablegen.h"
#include "fdctdsp.h"
#include "internal.h"
#include "me_cmp.h"
#include "pixblockdsp.h"
#include "put_bits.h"
#include "dv.h"
#include "dv_tablegen.h"
#include "dv_profile_internal.h"
static
av_cold
int
dvvideo_encode_init
(
AVCodecContext
*
avctx
)
{
...
...
@@ -48,7 +50,7 @@ static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
s
->
sys
=
av_dv_codec_profile
(
avctx
->
width
,
avctx
->
height
,
avctx
->
pix_fmt
);
if
(
!
s
->
sys
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Found no DV profile for %ix%i %s video. "
"Valid DV profiles are:
\n
"
,
"Valid DV profiles are:
\n
"
,
avctx
->
width
,
avctx
->
height
,
av_get_pix_fmt_name
(
avctx
->
pix_fmt
));
ff_dv_print_profiles
(
avctx
,
AV_LOG_ERROR
);
return
AVERROR
(
EINVAL
);
...
...
@@ -80,19 +82,19 @@ static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
}
/* bit budget for AC only in 5 MBs */
static
const
int
vs_total_ac_bits
=
(
100
*
4
+
68
*
2
)
*
5
;
static
const
int
vs_total_ac_bits
=
(
100
*
4
+
68
*
2
)
*
5
;
static
const
int
mb_area_start
[
5
]
=
{
1
,
6
,
21
,
43
,
64
};
#if CONFIG_SMALL
/* Converts run and level (where level != 0) pair into VLC, returning bit size */
static
av_always_inline
int
dv_rl2vlc
(
int
run
,
int
level
,
int
sign
,
uint32_t
*
vlc
)
/* Convert run and level (where level != 0) pair into VLC, returning bit size */
static
av_always_inline
int
dv_rl2vlc
(
int
run
,
int
level
,
int
sign
,
uint32_t
*
vlc
)
{
int
size
;
if
(
run
<
DV_VLC_MAP_RUN_SIZE
&&
level
<
DV_VLC_MAP_LEV_SIZE
)
{
*
vlc
=
dv_vlc_map
[
run
][
level
].
vlc
|
sign
;
size
=
dv_vlc_map
[
run
][
level
].
size
;
}
else
{
}
else
{
if
(
level
<
DV_VLC_MAP_LEV_SIZE
)
{
*
vlc
=
dv_vlc_map
[
0
][
level
].
vlc
|
sign
;
size
=
dv_vlc_map
[
0
][
level
].
size
;
...
...
@@ -101,9 +103,9 @@ static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vl
size
=
16
;
}
if
(
run
)
{
*
vlc
|=
((
run
<
16
)
?
dv_vlc_map
[
run
-
1
][
0
].
vlc
:
(
0x1f80
|
(
run
-
1
)))
<<
size
;
size
+=
(
run
<
16
)
?
dv_vlc_map
[
run
-
1
][
0
].
size
:
13
;
*
vlc
|=
((
run
<
16
)
?
dv_vlc_map
[
run
-
1
][
0
].
vlc
:
(
0x1f80
|
(
run
-
1
)))
<<
size
;
size
+=
(
run
<
16
)
?
dv_vlc_map
[
run
-
1
][
0
].
size
:
13
;
}
}
...
...
@@ -116,17 +118,15 @@ static av_always_inline int dv_rl2vlc_size(int run, int level)
if
(
run
<
DV_VLC_MAP_RUN_SIZE
&&
level
<
DV_VLC_MAP_LEV_SIZE
)
{
size
=
dv_vlc_map
[
run
][
level
].
size
;
}
else
{
}
else
{
size
=
(
level
<
DV_VLC_MAP_LEV_SIZE
)
?
dv_vlc_map
[
0
][
level
].
size
:
16
;
if
(
run
)
{
size
+=
(
run
<
16
)
?
dv_vlc_map
[
run
-
1
][
0
].
size
:
13
;
}
if
(
run
)
size
+=
(
run
<
16
)
?
dv_vlc_map
[
run
-
1
][
0
].
size
:
13
;
}
return
size
;
}
#else
static
av_always_inline
int
dv_rl2vlc
(
int
run
,
int
l
,
int
sign
,
uint32_t
*
vlc
)
static
av_always_inline
int
dv_rl2vlc
(
int
run
,
int
l
,
int
sign
,
uint32_t
*
vlc
)
{
*
vlc
=
dv_vlc_map
[
run
][
l
].
vlc
|
sign
;
return
dv_vlc_map
[
run
][
l
].
size
;
...
...
@@ -152,55 +152,60 @@ 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
,
PutBitContext
*
pb_end
)
static
av_always_inline
PutBitContext
*
dv_encode_ac
(
EncBlockInfo
*
bi
,
PutBitContext
*
pb_pool
,
PutBitContext
*
pb_end
)
{
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
(;;){
/* 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
);
}
if
(
pb
+
1
>=
pb_end
)
{
bi
->
partial_bit_count
=
size
;
bi
->
partial_bit_buffer
=
vlc
;
return
pb
;
}
}
/* Store VLC */
put_bits
(
pb
,
size
,
vlc
);
if
(
bi
->
cur_ac
>=
64
)
break
;
/* Construct the next VLC */
prev
=
bi
->
cur_ac
;
bi
->
cur_ac
=
bi
->
next
[
prev
];
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 */
}
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
(;;)
{
/* 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
);
}
if
(
pb
+
1
>=
pb_end
)
{
bi
->
partial_bit_count
=
size
;
bi
->
partial_bit_buffer
=
vlc
;
return
pb
;
}
}
/* Store VLC */
put_bits
(
pb
,
size
,
vlc
);
if
(
bi
->
cur_ac
>=
64
)
break
;
/* Construct the next VLC */
prev
=
bi
->
cur_ac
;
bi
->
cur_ac
=
bi
->
next
[
prev
];
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 */
}
}
return
pb
;
}
static
av_always_inline
int
dv_guess_dct_mode
(
DVVideoContext
*
s
,
uint8_t
*
data
,
int
linesize
)
{
static
av_always_inline
int
dv_guess_dct_mode
(
DVVideoContext
*
s
,
uint8_t
*
data
,
int
linesize
)
{
if
(
s
->
avctx
->
flags
&
CODEC_FLAG_INTERLACED_DCT
)
{
int
ps
=
s
->
ildct_cmp
(
NULL
,
data
,
NULL
,
linesize
,
8
)
-
400
;
if
(
ps
>
0
)
{
int
is
=
s
->
ildct_cmp
(
NULL
,
data
,
NULL
,
linesize
<<
1
,
4
)
+
s
->
ildct_cmp
(
NULL
,
data
+
linesize
,
NULL
,
linesize
<<
1
,
4
);
int
is
=
s
->
ildct_cmp
(
NULL
,
data
,
NULL
,
linesize
<<
1
,
4
)
+
s
->
ildct_cmp
(
NULL
,
data
+
linesize
,
NULL
,
linesize
<<
1
,
4
);
return
ps
>
is
;
}
}
...
...
@@ -210,94 +215,102 @@ static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data,
static
const
int
dv_weight_bits
=
18
;
static
const
int
dv_weight_88
[
64
]
=
{
131072
,
257107
,
257107
,
242189
,
252167
,
242189
,
235923
,
237536
,
237536
,
235923
,
229376
,
231390
,
223754
,
231390
,
229376
,
222935
,
224969
,
217965
,
217965
,
224969
,
222935
,
200636
,
218652
,
211916
,
212325
,
211916
,
218652
,
200636
,
188995
,
196781
,
205965
,
206433
,
206433
,
205965
,
196781
,
188995
,
185364
,
185364
,
200636
,
200704
,
200636
,
185364
,
185364
,
174609
,
180568
,
195068
,
195068
,
180568
,
174609
,
170091
,
175557
,
189591
,
175557
,
170091
,
165371
,
170627
,
170627
,
165371
,
160727
,
153560
,
160727
,
144651
,
144651
,
136258
,
131072
,
257107
,
257107
,
242189
,
252167
,
242189
,
235923
,
237536
,
237536
,
235923
,
229376
,
231390
,
223754
,
231390
,
229376
,
222935
,
224969
,
217965
,
217965
,
224969
,
222935
,
200636
,
218652
,
211916
,
212325
,
211916
,
218652
,
200636
,
188995
,
196781
,
205965
,
206433
,
206433
,
205965
,
196781
,
188995
,
185364
,
185364
,
200636
,
200704
,
200636
,
185364
,
185364
,
174609
,
180568
,
195068
,
195068
,
180568
,
174609
,
170091
,
175557
,
189591
,
175557
,
170091
,
165371
,
170627
,
170627
,
165371
,
160727
,
153560
,
160727
,
144651
,
144651
,
136258
,
};
static
const
int
dv_weight_248
[
64
]
=
{
131072
,
242189
,
257107
,
237536
,
229376
,
200636
,
242189
,
223754
,
224969
,
196781
,
262144
,
242189
,
229376
,
200636
,
257107
,
237536
,
211916
,
185364
,
235923
,
217965
,
229376
,
211916
,
206433
,
180568
,
242189
,
223754
,
224969
,
196781
,
211916
,
185364
,
235923
,
217965
,
200704
,
175557
,
222935
,
205965
,
200636
,
185364
,
195068
,
170627
,
229376
,
211916
,
206433
,
180568
,
200704
,
175557
,
222935
,
205965
,
175557
,
153560
,
188995
,
174609
,
165371
,
144651
,
200636
,
185364
,
195068
,
170627
,
175557
,
153560
,
188995
,
174609
,
165371
,
144651
,
131072
,
242189
,
257107
,
237536
,
229376
,
200636
,
242189
,
223754
,
224969
,
196781
,
262144
,
242189
,
229376
,
200636
,
257107
,
237536
,
211916
,
185364
,
235923
,
217965
,
229376
,
211916
,
206433
,
180568
,
242189
,
223754
,
224969
,
196781
,
211916
,
185364
,
235923
,
217965
,
200704
,
175557
,
222935
,
205965
,
200636
,
185364
,
195068
,
170627
,
229376
,
211916
,
206433
,
180568
,
200704
,
175557
,
222935
,
205965
,
175557
,
153560
,
188995
,
174609
,
165371
,
144651
,
200636
,
185364
,
195068
,
170627
,
175557
,
153560
,
188995
,
174609
,
165371
,
144651
,
};
static
av_always_inline
int
dv_init_enc_block
(
EncBlockInfo
*
bi
,
uint8_t
*
data
,
int
linesize
,
DVVideoContext
*
s
,
int
bias
)
static
av_always_inline
int
dv_init_enc_block
(
EncBlockInfo
*
bi
,
uint8_t
*
data
,
int
linesize
,
DVVideoContext
*
s
,
int
bias
)
{
const
int
*
weight
;
const
uint8_t
*
zigzag_scan
;
const
uint8_t
*
zigzag_scan
;
LOCAL_ALIGNED_16
(
int16_t
,
blk
,
[
64
]);
int
i
,
area
;
/* We offer two different methods for class number assignment: the
method suggested in SMPTE 314M Table 22, and an improved
method. The SMPTE method is very conservative; it assigns class
3 (i.e. severe quantization) to any block where the largest AC
component is greater than 36. Libav's DV encoder tracks AC bit
consumption precisely, so there is no need to bias most blocks
towards strongly lossy compression. Instead, we assign class 2
to most blocks, and use class 3 only when strictly necessary
(for blocks whose largest AC component exceeds 255). */
*
method suggested in SMPTE 314M Table 22, and an improved
*
method. The SMPTE method is very conservative; it assigns class
*
3 (i.e. severe quantization) to any block where the largest AC
*
component is greater than 36. Libav's DV encoder tracks AC bit
*
consumption precisely, so there is no need to bias most blocks
*
towards strongly lossy compression. Instead, we assign class 2
*
to most blocks, and use class 3 only when strictly necessary
*
(for blocks whose largest AC component exceeds 255). */
#if 0 /* SMPTE spec method */
static const int classes[] = {
12, 24, 36, 0xffff
};
static const int classes[] = {
12, 24, 36, 0xffff
};
#else
/* improved Libav method */
static
const
int
classes
[]
=
{
-
1
,
-
1
,
255
,
0xffff
};
static
const
int
classes
[]
=
{
-
1
,
-
1
,
255
,
0xffff
};
#endif
int
max
=
classes
[
0
];
int
prev
=
0
;
assert
((((
int
)
blk
)
&
15
)
==
0
);
assert
((((
int
)
blk
)
&
15
)
==
0
);
bi
->
area_q
[
0
]
=
bi
->
area_q
[
1
]
=
bi
->
area_q
[
2
]
=
bi
->
area_q
[
3
]
=
0
;
bi
->
partial_bit_count
=
0
;
bi
->
area_q
[
0
]
=
bi
->
area_q
[
1
]
=
bi
->
area_q
[
2
]
=
bi
->
area_q
[
3
]
=
0
;
bi
->
partial_bit_count
=
0
;
bi
->
partial_bit_buffer
=
0
;
bi
->
cur_ac
=
0
;
bi
->
cur_ac
=
0
;
if
(
data
)
{
bi
->
dct_mode
=
dv_guess_dct_mode
(
s
,
data
,
linesize
);
s
->
get_pixels
(
blk
,
data
,
linesize
);
s
->
fdct
[
bi
->
dct_mode
](
blk
);
}
else
{
/* We rely on the fact that encoding all zeros leads to an immediate EOB,
which is precisely what the spec calls for in the "dummy" blocks. */
memset
(
blk
,
0
,
64
*
sizeof
(
*
blk
));
/* We rely on the fact that encoding all zeros leads to an immediate
* EOB, which is precisely what the spec calls for in the "dummy"
* blocks. */
memset
(
blk
,
0
,
64
*
sizeof
(
*
blk
));
bi
->
dct_mode
=
0
;
}
bi
->
mb
[
0
]
=
blk
[
0
];
zigzag_scan
=
bi
->
dct_mode
?
ff_dv_zigzag248_direct
:
ff_zigzag_direct
;
weight
=
bi
->
dct_mode
?
dv_weight_248
:
dv_weight_88
;
weight
=
bi
->
dct_mode
?
dv_weight_248
:
dv_weight_88
;
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
++
)
{
int
level
=
blk
[
zigzag_scan
[
i
]];
if
(
level
+
15
>
30U
)
{
bi
->
sign
[
i
]
=
(
level
>>
31
)
&
1
;
/* weight 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
);
bi
->
mb
[
i
]
=
level
;
if
(
level
>
max
)
max
=
level
;
bi
->
bit_size
[
area
]
+=
dv_rl2vlc_size
(
i
-
prev
-
1
,
level
);
bi
->
next
[
prev
]
=
i
;
prev
=
i
;
}
}
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
++
)
{
int
level
=
blk
[
zigzag_scan
[
i
]];
if
(
level
+
15
>
30U
)
{
bi
->
sign
[
i
]
=
(
level
>>
31
)
&
1
;
/* Weight 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
);
bi
->
mb
[
i
]
=
level
;
if
(
level
>
max
)
max
=
level
;
bi
->
bit_size
[
area
]
+=
dv_rl2vlc_size
(
i
-
prev
-
1
,
level
);
bi
->
next
[
prev
]
=
i
;
prev
=
i
;
}
}
}
bi
->
next
[
prev
]
=
i
;
for
(
bi
->
cno
=
0
;
max
>
classes
[
bi
->
cno
];
bi
->
cno
++
);
bi
->
next
[
prev
]
=
i
;
for
(
bi
->
cno
=
0
;
max
>
classes
[
bi
->
cno
];
bi
->
cno
++
)
;
bi
->
cno
+=
bias
;
...
...
@@ -308,85 +321,89 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, i
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
])
{
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
;
bi
->
next
[
prev
]
=
i
;
prev
=
i
;
}
}
}
bi
->
next
[
prev
]
=
i
;
bi
->
next
[
prev
]
=
i
;
}
return
bi
->
bit_size
[
0
]
+
bi
->
bit_size
[
1
]
+
bi
->
bit_size
[
2
]
+
bi
->
bit_size
[
3
];
return
bi
->
bit_size
[
0
]
+
bi
->
bit_size
[
1
]
+
bi
->
bit_size
[
2
]
+
bi
->
bit_size
[
3
];
}
static
inline
void
dv_guess_qnos
(
EncBlockInfo
*
blks
,
int
*
qnos
)
static
inline
void
dv_guess_qnos
(
EncBlockInfo
*
blks
,
int
*
qnos
)
{
int
size
[
5
];
int
i
,
j
,
k
,
a
,
prev
,
a2
;
EncBlockInfo
*
b
;
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
++
)
{
if
(
!
qnos
[
i
])
continue
;
qnos
[
i
]
--
;
size
[
i
]
=
0
;
for
(
j
=
0
;
j
<
6
;
j
++
,
b
++
)
{
for
(
a
=
0
;
a
<
4
;
a
++
)
{
if
(
b
->
area_q
[
a
]
!=
ff_dv_quant_shifts
[
qnos
[
i
]
+
ff_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
];
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
])
{
b
->
mb
[
k
]
>>=
1
;
if
(
b
->
mb
[
k
])
{
b
->
bit_size
[
a
]
+=
dv_rl2vlc_size
(
k
-
prev
-
1
,
b
->
mb
[
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
++
)
b
=
blks
;
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
++
)
{
if
(
b
->
area_q
[
a
]
!=
ff_dv_quant_shifts
[
qnos
[
i
]
+
ff_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
];
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
])
{
b
->
mb
[
k
]
>>=
1
;
if
(
b
->
mb
[
k
])
{
b
->
bit_size
[
a
]
+=
dv_rl2vlc_size
(
k
-
prev
-
1
,
b
->
mb
[
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
++
)
b
->
prev
[
a2
]
=
prev
;
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
));
b
->
prev
[
a2
]
=
prev
;
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
));
b
->
prev
[
a2
]
=
prev
;
}
b
->
next
[
prev
]
=
b
->
next
[
k
];
}
}
b
->
next
[
prev
]
=
b
->
next
[
k
];
}
}
b
->
prev
[
a
+
1
]
=
prev
;
}
b
->
prev
[
a
+
1
]
=
prev
;
size
[
i
]
+=
b
->
bit_size
[
a
]
;
}
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
]);
}
}
while
(
qnos
[
0
]
|
qnos
[
1
]
|
qnos
[
2
]
|
qnos
[
3
]
|
qnos
[
4
]);
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
++
)
{
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
){
if
(
b
->
mb
[
k
]
<
a
&&
b
->
mb
[
k
]
>
-
a
)
{
b
->
next
[
prev
]
=
b
->
next
[
k
];
}
else
{
}
else
{
size
[
0
]
+=
dv_rl2vlc_size
(
k
-
prev
-
1
,
b
->
mb
[
k
]);
prev
=
k
;
prev
=
k
;
}
}
}
...
...
@@ -399,45 +416,46 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
DVwork_chunk
*
work_chunk
=
arg
;
int
mb_index
,
i
,
j
;
int
mb_x
,
mb_y
,
c_offset
,
linesize
,
y_stride
;
uint8_t
*
y_ptr
;
uint8_t
*
dif
;
uint8_t
*
y_ptr
;
uint8_t
*
dif
;
LOCAL_ALIGNED_8
(
uint8_t
,
scratch
,
[
128
]);
EncBlockInfo
enc_blks
[
5
*
DV_MAX_BPM
];
PutBitContext
pbs
[
5
*
DV_MAX_BPM
];
PutBitContext
*
pb
;
EncBlockInfo
*
enc_blk
;
int
vs_bit_size
=
0
;
int
qnos
[
5
]
=
{
15
,
15
,
15
,
15
,
15
};
/* No quantization */
int
*
qnosp
=
&
qnos
[
0
];
dif
=
&
s
->
buf
[
work_chunk
->
buf_offset
*
80
];
EncBlockInfo
enc_blks
[
5
*
DV_MAX_BPM
];
PutBitContext
pbs
[
5
*
DV_MAX_BPM
];
PutBitContext
*
pb
;
EncBlockInfo
*
enc_blk
;
int
vs_bit_size
=
0
;
int
qnos
[
5
]
=
{
15
,
15
,
15
,
15
,
15
};
/* No quantization */
int
*
qnosp
=
&
qnos
[
0
];
dif
=
&
s
->
buf
[
work_chunk
->
buf_offset
*
80
];
enc_blk
=
&
enc_blks
[
0
];
for
(
mb_index
=
0
;
mb_index
<
5
;
mb_index
++
)
{
dv_calculate_mb_xy
(
s
,
work_chunk
,
mb_index
,
&
mb_x
,
&
mb_y
);
/* initializing luminance blocks */
if
((
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
)
||
if
((
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
)
||
(
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
||
(
s
->
sys
->
height
>=
720
&&
mb_y
!=
134
))
{
y_stride
=
s
->
frame
->
linesize
[
0
]
<<
3
;
}
else
{
y_stride
=
16
;
}
y_ptr
=
s
->
frame
->
data
[
0
]
+
((
mb_y
*
s
->
frame
->
linesize
[
0
]
+
mb_x
)
<<
3
);
y_ptr
=
s
->
frame
->
data
[
0
]
+
((
mb_y
*
s
->
frame
->
linesize
[
0
]
+
mb_x
)
<<
3
);
linesize
=
s
->
frame
->
linesize
[
0
];
if
(
s
->
sys
->
video_stype
==
4
)
{
/* SD 422 */
vs_bit_size
+=
dv_init_enc_block
(
enc_blk
+
0
,
y_ptr
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
1
,
NULL
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
2
,
y_ptr
+
8
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
3
,
NULL
,
linesize
,
s
,
0
);
dv_init_enc_block
(
enc_blk
+
0
,
y_ptr
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
1
,
NULL
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
2
,
y_ptr
+
8
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
3
,
NULL
,
linesize
,
s
,
0
);
}
else
{
vs_bit_size
+=
dv_init_enc_block
(
enc_blk
+
0
,
y_ptr
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
1
,
y_ptr
+
8
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
2
,
y_ptr
+
y_stride
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
3
,
y_ptr
+
8
+
y_stride
,
linesize
,
s
,
0
);
dv_init_enc_block
(
enc_blk
+
0
,
y_ptr
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
1
,
y_ptr
+
8
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
2
,
y_ptr
+
y_stride
,
linesize
,
s
,
0
)
+
dv_init_enc_block
(
enc_blk
+
3
,
y_ptr
+
8
+
y_stride
,
linesize
,
s
,
0
);
}
enc_blk
+=
4
;
...
...
@@ -449,23 +467,29 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
linesize
=
s
->
frame
->
linesize
[
j
];
y_stride
=
(
mb_y
==
134
)
?
8
:
(
s
->
frame
->
linesize
[
j
]
<<
3
);
if
(
s
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV411P
&&
mb_x
>=
(
704
/
8
))
{
uint8_t
*
d
;
uint8_t
*
b
=
scratch
;
uint8_t
*
d
;
uint8_t
*
b
=
scratch
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
d
=
c_ptr
+
(
linesize
<<
3
);
b
[
0
]
=
c_ptr
[
0
];
b
[
1
]
=
c_ptr
[
1
];
b
[
2
]
=
c_ptr
[
2
];
b
[
3
]
=
c_ptr
[
3
];
b
[
4
]
=
d
[
0
];
b
[
5
]
=
d
[
1
];
b
[
6
]
=
d
[
2
];
b
[
7
]
=
d
[
3
];
d
=
c_ptr
+
(
linesize
<<
3
);
b
[
0
]
=
c_ptr
[
0
];
b
[
1
]
=
c_ptr
[
1
];
b
[
2
]
=
c_ptr
[
2
];
b
[
3
]
=
c_ptr
[
3
];
b
[
4
]
=
d
[
0
];
b
[
5
]
=
d
[
1
];
b
[
6
]
=
d
[
2
];
b
[
7
]
=
d
[
3
];
c_ptr
+=
linesize
;
b
+=
16
;
b
+=
16
;
}
c_ptr
=
scratch
;
c_ptr
=
scratch
;
linesize
=
16
;
}
vs_bit_size
+=
dv_init_enc_block
(
enc_blk
++
,
c_ptr
,
linesize
,
s
,
1
);
if
(
s
->
sys
->
bpm
==
8
)
{
vs_bit_size
+=
dv_init_enc_block
(
enc_blk
++
,
c_ptr
+
y_stride
,
linesize
,
s
,
1
);
}
vs_bit_size
+=
dv_init_enc_block
(
enc_blk
++
,
c_ptr
,
linesize
,
s
,
1
);
if
(
s
->
sys
->
bpm
==
8
)
vs_bit_size
+=
dv_init_enc_block
(
enc_blk
++
,
c_ptr
+
y_stride
,
linesize
,
s
,
1
);
}
}
...
...
@@ -473,59 +497,60 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
dv_guess_qnos
(
&
enc_blks
[
0
],
qnosp
);
/* DIF encoding process */
for
(
j
=
0
;
j
<
5
*
s
->
sys
->
bpm
;)
{
for
(
j
=
0
;
j
<
5
*
s
->
sys
->
bpm
;)
{
int
start_mb
=
j
;
dif
[
3
]
=
*
qnosp
++
;
dif
+=
4
;
dif
+=
4
;
/* First pass over individual cells only */
for
(
i
=
0
;
i
<
s
->
sys
->
bpm
;
i
++
,
j
++
)
{
int
sz
=
s
->
sys
->
block_sizes
[
i
]
>>
3
;
for
(
i
=
0
;
i
<
s
->
sys
->
bpm
;
i
++
,
j
++
)
{
int
sz
=
s
->
sys
->
block_sizes
[
i
]
>>
3
;
init_put_bits
(
&
pbs
[
j
],
dif
,
sz
);
put_sbits
(
&
pbs
[
j
],
9
,
((
enc_blks
[
j
].
mb
[
0
]
>>
3
)
-
1024
+
2
)
>>
2
);
put_bits
(
&
pbs
[
j
],
1
,
enc_blks
[
j
].
dct_mode
);
put_bits
(
&
pbs
[
j
],
2
,
enc_blks
[
j
].
cno
);
dv_encode_ac
(
&
enc_blks
[
j
],
&
pbs
[
j
],
&
pbs
[
j
+
1
]);
dv_encode_ac
(
&
enc_blks
[
j
],
&
pbs
[
j
],
&
pbs
[
j
+
1
]);
dif
+=
sz
;
}
/* Second pass over each MB space */
pb
=
&
pbs
[
start_mb
];
for
(
i
=
0
;
i
<
s
->
sys
->
bpm
;
i
++
)
{
if
(
enc_blks
[
start_mb
+
i
].
partial_bit_count
)
pb
=
dv_encode_ac
(
&
enc_blks
[
start_mb
+
i
],
pb
,
&
pbs
[
start_mb
+
s
->
sys
->
bpm
]);
}
for
(
i
=
0
;
i
<
s
->
sys
->
bpm
;
i
++
)
if
(
enc_blks
[
start_mb
+
i
].
partial_bit_count
)
pb
=
dv_encode_ac
(
&
enc_blks
[
start_mb
+
i
],
pb
,
&
pbs
[
start_mb
+
s
->
sys
->
bpm
]);
}
/* Third and final pass over the whole video segment space */
pb
=
&
pbs
[
0
];
for
(
j
=
0
;
j
<
5
*
s
->
sys
->
bpm
;
j
++
)
{
if
(
enc_blks
[
j
].
partial_bit_count
)
pb
=
dv_encode_ac
(
&
enc_blks
[
j
],
pb
,
&
pbs
[
s
->
sys
->
bpm
*
5
]);
if
(
enc_blks
[
j
].
partial_bit_count
)
for
(
j
=
0
;
j
<
5
*
s
->
sys
->
bpm
;
j
++
)
{
if
(
enc_blks
[
j
].
partial_bit_count
)
pb
=
dv_encode_ac
(
&
enc_blks
[
j
],
pb
,
&
pbs
[
s
->
sys
->
bpm
*
5
]);
if
(
enc_blks
[
j
].
partial_bit_count
)
av_log
(
avctx
,
AV_LOG_ERROR
,
"ac bitstream overflow
\n
"
);
}
for
(
j
=
0
;
j
<
5
*
s
->
sys
->
bpm
;
j
++
)
{
int
pos
;
int
size
=
pbs
[
j
].
size_in_bits
>>
3
;
flush_put_bits
(
&
pbs
[
j
]);
pos
=
put_bits_count
(
&
pbs
[
j
])
>>
3
;
if
(
pos
>
size
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"bitstream written beyond buffer size
\n
"
);
return
-
1
;
}
memset
(
pbs
[
j
].
buf
+
pos
,
0xff
,
size
-
pos
);
for
(
j
=
0
;
j
<
5
*
s
->
sys
->
bpm
;
j
++
)
{
int
pos
;
int
size
=
pbs
[
j
].
size_in_bits
>>
3
;
flush_put_bits
(
&
pbs
[
j
]);
pos
=
put_bits_count
(
&
pbs
[
j
])
>>
3
;
if
(
pos
>
size
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"bitstream written beyond buffer size
\n
"
);
return
-
1
;
}
memset
(
pbs
[
j
].
buf
+
pos
,
0xff
,
size
-
pos
);
}
return
0
;
}
static
inline
int
dv_write_pack
(
enum
dv_pack_type
pack_id
,
DVVideoContext
*
c
,
uint8_t
*
buf
)
uint8_t
*
buf
)
{
/*
* Here's what SMPTE314M says about these two:
...
...
@@ -545,62 +570,66 @@ static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
* 2. It is not at all clear what STYPE is used for 4:2:0 PAL
* compression scheme (if any).
*/
int
apt
=
(
c
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
?
0
:
1
);
int
apt
=
(
c
->
sys
->
pix_fmt
==
AV_PIX_FMT_YUV420P
?
0
:
1
);
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
;
buf
[
0
]
=
(
uint8_t
)
pack_id
;
switch
(
pack_id
)
{
case
dv_header525
:
/* I can't imagine why these two weren't defined as real */
case
dv_header625
:
/* packs in SMPTE314M -- they definitely look like ones */
buf
[
1
]
=
0xf8
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* APT: Track application ID */
buf
[
2
]
=
(
0
<<
7
)
|
/* TF1: audio data is 0 - valid; 1 - invalid */
(
0x0f
<<
3
)
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* AP1: Audio application ID */
buf
[
3
]
=
(
0
<<
7
)
|
/* TF2: video data is 0 - valid; 1 - invalid */
(
0x0f
<<
3
)
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* AP2: Video application ID */
buf
[
4
]
=
(
0
<<
7
)
|
/* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
(
0x0f
<<
3
)
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* AP3: Subcode application ID */
break
;
buf
[
1
]
=
0xf8
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* APT: Track application ID */
buf
[
2
]
=
(
0
<<
7
)
|
/* TF1: audio data is 0 - valid; 1 - invalid */
(
0x0f
<<
3
)
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* AP1: Audio application ID */
buf
[
3
]
=
(
0
<<
7
)
|
/* TF2: video data is 0 - valid; 1 - invalid */
(
0x0f
<<
3
)
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* AP2: Video application ID */
buf
[
4
]
=
(
0
<<
7
)
|
/* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
(
0x0f
<<
3
)
|
/* reserved -- always 1 */
(
apt
&
0x07
);
/* AP3: Subcode application ID */
break
;
case
dv_video_source
:
buf
[
1
]
=
0xff
;
/* reserved -- always 1 */
buf
[
2
]
=
(
1
<<
7
)
|
/* B/W: 0 - b/w, 1 - color */
(
1
<<
6
)
|
/* following CLF is valid - 0, invalid - 1 */
(
3
<<
4
)
|
/* CLF: color frames ID (see ITU-R BT.470-4) */
0xf
;
/* reserved -- always 1 */
buf
[
3
]
=
(
3
<<
6
)
|
/* reserved -- always 1 */
(
c
->
sys
->
dsf
<<
5
)
|
/* system: 60fields/50fields */
c
->
sys
->
video_stype
;
/* signal type video compression */
buf
[
4
]
=
0xff
;
/* VISC: 0xff -- no information */
break
;
buf
[
1
]
=
0xff
;
/* reserved -- always 1 */
buf
[
2
]
=
(
1
<<
7
)
|
/* B/W: 0 - b/w, 1 - color */
(
1
<<
6
)
|
/* following CLF is valid - 0, invalid - 1 */
(
3
<<
4
)
|
/* CLF: color frames ID (see ITU-R BT.470-4) */
0xf
;
/* reserved -- always 1 */
buf
[
3
]
=
(
3
<<
6
)
|
/* reserved -- always 1 */
(
c
->
sys
->
dsf
<<
5
)
|
/* system: 60fields/50fields */
c
->
sys
->
video_stype
;
/* signal type video compression */
buf
[
4
]
=
0xff
;
/* VISC: 0xff -- no information */
break
;
case
dv_video_control
:
buf
[
1
]
=
(
0
<<
6
)
|
/* Copy generation management (CGMS) 0 -- free */
0x3f
;
/* reserved -- always 1 */
buf
[
2
]
=
0xc8
|
/* reserved -- always b11001xxx */
aspect
;
buf
[
3
]
=
(
1
<<
7
)
|
/* frame/field flag 1 -- frame, 0 -- field */
(
1
<<
6
)
|
/* first/second field flag 0 -- field 2, 1 -- field 1 */
(
1
<<
5
)
|
/* frame change flag 0 -- same picture as before, 1 -- different */
(
1
<<
4
)
|
/* 1 - interlaced, 0 - noninterlaced */
0xc
;
/* reserved -- always b1100 */
buf
[
4
]
=
0xff
;
/* reserved -- always 1 */
break
;
buf
[
1
]
=
(
0
<<
6
)
|
/* Copy generation management (CGMS) 0 -- free */
0x3f
;
/* reserved -- always 1 */
buf
[
2
]
=
0xc8
|
/* reserved -- always b11001xxx */
aspect
;
buf
[
3
]
=
(
1
<<
7
)
|
/* frame/field flag 1 -- frame, 0 -- field */
(
1
<<
6
)
|
/* first/second field flag 0 -- field 2, 1 -- field 1 */
(
1
<<
5
)
|
/* frame change flag 0 -- same picture as before, 1 -- different */
(
1
<<
4
)
|
/* 1 - interlaced, 0 - noninterlaced */
0xc
;
/* reserved -- always b1100 */
buf
[
4
]
=
0xff
;
/* reserved -- always 1 */
break
;
default:
buf
[
1
]
=
buf
[
2
]
=
buf
[
3
]
=
buf
[
4
]
=
0xff
;
buf
[
1
]
=
buf
[
2
]
=
buf
[
3
]
=
buf
[
4
]
=
0xff
;
}
return
5
;
}
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
)
uint8_t
*
buf
)
{
buf
[
0
]
=
(
uint8_t
)
t
;
/* Section type */
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 */
(
chan_num
<<
3
)
|
/* FSC: for 50Mb/s 0 - first channel; 1 - second */
7
;
/* reserved -- always 1 */
...
...
@@ -608,19 +637,16 @@ static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
return
3
;
}
static
inline
int
dv_write_ssyb_id
(
uint8_t
syb_num
,
uint8_t
fr
,
uint8_t
*
buf
)
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) */
0x0f
;
/* reserved -- always 1 */
}
else
if
(
syb_num
==
11
)
{
}
else
if
(
syb_num
==
11
)
{
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
0x7f
;
/* reserved -- always 1 */
}
else
{
}
else
{
buf
[
0
]
=
(
fr
<<
7
)
|
/* FR ID 1 - first half of each channel; 0 - second */
(
0
<<
4
)
|
/* APT (Track application ID) */
0x0f
;
/* reserved -- always 1 */
...
...
@@ -631,7 +657,7 @@ static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
return
3
;
}
static
void
dv_format_frame
(
DVVideoContext
*
c
,
uint8_t
*
buf
)
static
void
dv_format_frame
(
DVVideoContext
*
c
,
uint8_t
*
buf
)
{
int
chan
,
i
,
j
,
k
;
...
...
@@ -641,14 +667,15 @@ static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
/* DV header: 1DIF */
buf
+=
dv_write_dif_id
(
dv_sect_header
,
chan
,
i
,
0
,
buf
);
buf
+=
dv_write_pack
((
c
->
sys
->
dsf
?
dv_header625
:
dv_header525
),
c
,
buf
);
buf
+=
dv_write_pack
((
c
->
sys
->
dsf
?
dv_header625
:
dv_header525
),
c
,
buf
);
buf
+=
72
;
/* unused bytes */
/* DV subcode: 2DIFs */
for
(
j
=
0
;
j
<
2
;
j
++
)
{
buf
+=
dv_write_dif_id
(
dv_sect_subcode
,
chan
,
i
,
j
,
buf
);
for
(
k
=
0
;
k
<
6
;
k
++
)
buf
+=
dv_write_ssyb_id
(
k
,
(
i
<
c
->
sys
->
difseg_size
/
2
),
buf
)
+
5
;
buf
+=
dv_write_ssyb_id
(
k
,
(
i
<
c
->
sys
->
difseg_size
/
2
),
buf
)
+
5
;
buf
+=
29
;
/* unused bytes */
}
...
...
@@ -657,30 +684,29 @@ static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
buf
+=
dv_write_dif_id
(
dv_sect_vaux
,
chan
,
i
,
j
,
buf
);
buf
+=
dv_write_pack
(
dv_video_source
,
c
,
buf
);
buf
+=
dv_write_pack
(
dv_video_control
,
c
,
buf
);
buf
+=
7
*
5
;
buf
+=
7
*
5
;
buf
+=
dv_write_pack
(
dv_video_source
,
c
,
buf
);
buf
+=
dv_write_pack
(
dv_video_control
,
c
,
buf
);
buf
+=
4
*
5
+
2
;
/* unused bytes */
buf
+=
4
*
5
+
2
;
/* unused bytes */
}
/* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
for
(
j
=
0
;
j
<
135
;
j
++
)
{
if
(
j
%
15
==
0
)
{
if
(
j
%
15
==
0
)
{
memset
(
buf
,
0xff
,
80
);
buf
+=
dv_write_dif_id
(
dv_sect_audio
,
chan
,
i
,
j
/
15
,
buf
);
buf
+=
dv_write_dif_id
(
dv_sect_audio
,
chan
,
i
,
j
/
15
,
buf
);
buf
+=
77
;
/* audio control & shuffled PCM audio */
}
buf
+=
dv_write_dif_id
(
dv_sect_video
,
chan
,
i
,
j
,
buf
);
buf
+=
77
;
/* 1 video macroblock: 1 bytes control
4 * 14 bytes Y 8x8 data
10 bytes Cr 8x8 data
10 bytes Cb 8x8 data */
*
4 * 14 bytes Y 8x8 data
*
10 bytes Cr 8x8 data
*
10 bytes Cb 8x8 data */
}
}
}
}
static
int
dvvideo_encode_frame
(
AVCodecContext
*
c
,
AVPacket
*
pkt
,
const
AVFrame
*
frame
,
int
*
got_packet
)
{
...
...
@@ -728,6 +754,7 @@ AVCodec ff_dvvideo_encoder = {
.
close
=
dvvideo_encode_close
,
.
capabilities
=
CODEC_CAP_SLICE_THREADS
,
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
};
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