Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
178fcca8
Commit
178fcca8
authored
Sep 25, 2004
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1/2 resolution decoding
Originally committed as revision 3507 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
bc133816
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
724 additions
and
73 deletions
+724
-73
ffmpeg.c
ffmpeg.c
+6
-0
ffplay.c
ffplay.c
+6
-0
avcodec.h
libavcodec/avcodec.h
+9
-1
dsputil.c
libavcodec/dsputil.c
+62
-9
dsputil.h
libavcodec/dsputil.h
+1
-0
dsputil_mmx.c
libavcodec/i386/dsputil_mmx.c
+17
-16
jrevdct.c
libavcodec/jrevdct.c
+456
-0
mpeg12.c
libavcodec/mpeg12.c
+4
-3
mpegvideo.c
libavcodec/mpegvideo.c
+158
-41
mpegvideo.h
libavcodec/mpegvideo.h
+5
-3
No files found.
ffmpeg.c
View file @
178fcca8
...
...
@@ -188,6 +188,8 @@ static int predictor = 0;
static
int
video_profile
=
FF_PROFILE_UNKNOWN
;
static
int
video_level
=
FF_LEVEL_UNKNOWN
;
static
int
nsse_weight
=
8
;
static
int
subpel_quality
=
8
;
static
int
lowres
=
0
;
extern
int
loop_input
;
/* currently a hack */
static
int
gop_size
=
12
;
...
...
@@ -3148,6 +3150,8 @@ static void opt_output_file(const char *filename)
video_enc
->
profile
=
video_profile
;
video_enc
->
level
=
video_level
;
video_enc
->
nsse_weight
=
nsse_weight
;
video_enc
->
me_subpel_quality
=
subpel_quality
;
video_enc
->
lowres
=
lowres
;
if
(
packet_size
){
video_enc
->
rtp_mode
=
1
;
...
...
@@ -3840,6 +3844,8 @@ const OptionDef options[] = {
{
"vprofile"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
|
OPT_VIDEO
,
{(
void
*
)
&
video_profile
},
"profile"
,
""
},
{
"vlevel"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
|
OPT_VIDEO
,
{(
void
*
)
&
video_level
},
"level"
,
""
},
{
"nssew"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
|
OPT_VIDEO
,
{(
void
*
)
&
nsse_weight
},
"weight"
,
""
},
{
"subq"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
|
OPT_VIDEO
,
{(
void
*
)
&
subpel_quality
},
""
,
""
},
{
"lowres"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
|
OPT_VIDEO
,
{(
void
*
)
&
lowres
},
""
,
""
},
/* audio options */
{
"ab"
,
HAS_ARG
|
OPT_AUDIO
,
{(
void
*
)
opt_audio_bitrate
},
"set audio bitrate (in kbit/s)"
,
"bitrate"
,
},
...
...
ffplay.c
View file @
178fcca8
...
...
@@ -171,6 +171,8 @@ static int step = 0;
static
int
thread_count
=
1
;
static
int
workaround_bugs
=
1
;
static
int
fast
=
0
;
static
int
lowres
=
0
;
static
int
idct
=
FF_IDCT_AUTO
;
/* current context */
static
int
is_full_screen
;
...
...
@@ -1173,6 +1175,8 @@ static int stream_component_open(VideoState *is, int stream_index)
enc
->
debug_mv
=
debug_mv
;
enc
->
debug
=
debug
;
enc
->
workaround_bugs
=
workaround_bugs
;
enc
->
lowres
=
lowres
;
enc
->
idct_algo
=
idct
;
if
(
fast
)
enc
->
flags2
|=
CODEC_FLAG2_FAST
;
if
(
!
codec
||
avcodec_open
(
enc
,
codec
)
<
0
)
...
...
@@ -1832,6 +1836,8 @@ const OptionDef options[] = {
{
"bug"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
,
{(
void
*
)
&
workaround_bugs
},
"workaround bugs"
,
""
},
{
"vismv"
,
HAS_ARG
|
OPT_EXPERT
,
{(
void
*
)
opt_vismv
},
"visualize motion vectors"
,
""
},
{
"fast"
,
OPT_BOOL
|
OPT_EXPERT
,
{(
void
*
)
&
fast
},
"non spec compliant optimizations"
,
""
},
{
"lowres"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
,
{(
void
*
)
&
lowres
},
""
,
""
},
{
"idct"
,
OPT_INT
|
HAS_ARG
|
OPT_EXPERT
,
{(
void
*
)
&
idct
},
"set idct algo"
,
"algo"
},
#ifdef CONFIG_NETWORK
{
"rtp_tcp"
,
OPT_EXPERT
,
{(
void
*
)
&
opt_rtp_tcp
},
"force RTP/TCP protocol usage"
,
""
},
#endif
...
...
libavcodec/avcodec.h
View file @
178fcca8
...
...
@@ -17,7 +17,7 @@ extern "C" {
#define FFMPEG_VERSION_INT 0x000409
#define FFMPEG_VERSION "0.4.9-pre1"
#define LIBAVCODEC_BUILD 472
1
#define LIBAVCODEC_BUILD 472
2
#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVCODEC_VERSION FFMPEG_VERSION
...
...
@@ -1111,6 +1111,7 @@ typedef struct AVCodecContext {
#define FF_IDCT_ALTIVEC 8
#define FF_IDCT_SH4 9
#define FF_IDCT_SIMPLEARM 10
#define FF_IDCT_INT4 11
/**
* slice count.
...
...
@@ -1656,6 +1657,13 @@ typedef struct AVCodecContext {
*/
int
level
;
#define FF_LEVEL_UNKNOWN -99
/**
* low resolution decoding. 1-> 1/2 size, 2->1/4 size
* - encoding: unused
* - decoding: set by user
*/
int
lowres
;
}
AVCodecContext
;
...
...
libavcodec/dsputil.c
View file @
178fcca8
...
...
@@ -446,6 +446,24 @@ static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
}
}
static
void
put_pixels_clamped4_c
(
const
DCTELEM
*
block
,
uint8_t
*
restrict
pixels
,
int
line_size
)
{
int
i
;
uint8_t
*
cm
=
cropTbl
+
MAX_NEG_CROP
;
/* read the pixels */
for
(
i
=
0
;
i
<
4
;
i
++
)
{
pixels
[
0
]
=
cm
[
block
[
0
]];
pixels
[
1
]
=
cm
[
block
[
1
]];
pixels
[
2
]
=
cm
[
block
[
2
]];
pixels
[
3
]
=
cm
[
block
[
3
]];
pixels
+=
line_size
;
block
+=
8
;
}
}
static
void
put_signed_pixels_clamped_c
(
const
DCTELEM
*
block
,
uint8_t
*
restrict
pixels
,
int
line_size
)
...
...
@@ -487,6 +505,23 @@ static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
block
+=
8
;
}
}
static
void
add_pixels_clamped4_c
(
const
DCTELEM
*
block
,
uint8_t
*
restrict
pixels
,
int
line_size
)
{
int
i
;
uint8_t
*
cm
=
cropTbl
+
MAX_NEG_CROP
;
/* read the pixels */
for
(
i
=
0
;
i
<
4
;
i
++
)
{
pixels
[
0
]
=
cm
[
pixels
[
0
]
+
block
[
0
]];
pixels
[
1
]
=
cm
[
pixels
[
1
]
+
block
[
1
]];
pixels
[
2
]
=
cm
[
pixels
[
2
]
+
block
[
2
]];
pixels
[
3
]
=
cm
[
pixels
[
3
]
+
block
[
3
]];
pixels
+=
line_size
;
block
+=
8
;
}
}
#if 0
#define PIXOP2(OPNAME, OP) \
...
...
@@ -3294,6 +3329,17 @@ static void ff_jref_idct_add(uint8_t *dest, int line_size, DCTELEM *block)
add_pixels_clamped_c
(
block
,
dest
,
line_size
);
}
static
void
ff_jref_idct4_put
(
uint8_t
*
dest
,
int
line_size
,
DCTELEM
*
block
)
{
j_rev_dct4
(
block
);
put_pixels_clamped4_c
(
block
,
dest
,
line_size
);
}
static
void
ff_jref_idct4_add
(
uint8_t
*
dest
,
int
line_size
,
DCTELEM
*
block
)
{
j_rev_dct4
(
block
);
add_pixels_clamped4_c
(
block
,
dest
,
line_size
);
}
/* init static data */
void
dsputil_static_init
(
void
)
{
...
...
@@ -3332,16 +3378,23 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
}
#endif //CONFIG_ENCODERS
if
(
avctx
->
idct_algo
==
FF_IDCT_INT
){
c
->
idct_put
=
ff_jref_idct_put
;
c
->
idct_add
=
ff_jref_idct_add
;
c
->
idct
=
j_rev_dct
;
c
->
idct_permutation_type
=
FF_LIBMPEG2_IDCT_PERM
;
}
else
{
//accurate/default
c
->
idct_put
=
simple_idct_put
;
c
->
idct_add
=
simple_idct_add
;
c
->
idct
=
simple_idct
;
if
(
avctx
->
lowres
==
1
){
c
->
idct_put
=
ff_jref_idct4_put
;
c
->
idct_add
=
ff_jref_idct4_add
;
c
->
idct
=
j_rev_dct4
;
c
->
idct_permutation_type
=
FF_NO_IDCT_PERM
;
}
else
{
if
(
avctx
->
idct_algo
==
FF_IDCT_INT
){
c
->
idct_put
=
ff_jref_idct_put
;
c
->
idct_add
=
ff_jref_idct_add
;
c
->
idct
=
j_rev_dct
;
c
->
idct_permutation_type
=
FF_LIBMPEG2_IDCT_PERM
;
}
else
{
//accurate/default
c
->
idct_put
=
simple_idct_put
;
c
->
idct_add
=
simple_idct_add
;
c
->
idct
=
simple_idct
;
c
->
idct_permutation_type
=
FF_NO_IDCT_PERM
;
}
}
/* VP3 DSP support */
...
...
libavcodec/dsputil.h
View file @
178fcca8
...
...
@@ -42,6 +42,7 @@ void ff_jpeg_fdct_islow (DCTELEM *data);
void
ff_fdct248_islow
(
DCTELEM
*
data
);
void
j_rev_dct
(
DCTELEM
*
data
);
void
j_rev_dct4
(
DCTELEM
*
data
);
void
ff_fdct_mmx
(
DCTELEM
*
block
);
void
ff_fdct_mmx2
(
DCTELEM
*
block
);
...
...
libavcodec/i386/dsputil_mmx.c
View file @
178fcca8
...
...
@@ -2984,23 +2984,24 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
}
}
#endif //CONFIG_ENCODERS
if
(
idct_algo
==
FF_IDCT_AUTO
||
idct_algo
==
FF_IDCT_SIMPLEMMX
){
c
->
idct_put
=
ff_simple_idct_put_mmx
;
c
->
idct_add
=
ff_simple_idct_add_mmx
;
c
->
idct
=
ff_simple_idct_mmx
;
c
->
idct_permutation_type
=
FF_SIMPLE_IDCT_PERM
;
}
else
if
(
idct_algo
==
FF_IDCT_LIBMPEG2MMX
){
if
(
mm_flags
&
MM_MMXEXT
){
c
->
idct_put
=
ff_libmpeg2mmx2_idct_put
;
c
->
idct_add
=
ff_libmpeg2mmx2_idct_add
;
c
->
idct
=
ff_mmxext_idct
;
}
else
{
c
->
idct_put
=
ff_libmpeg2mmx_idct_put
;
c
->
idct_add
=
ff_libmpeg2mmx_idct_add
;
c
->
idct
=
ff_mmx_idct
;
if
(
avctx
->
lowres
==
0
){
if
(
idct_algo
==
FF_IDCT_AUTO
||
idct_algo
==
FF_IDCT_SIMPLEMMX
){
c
->
idct_put
=
ff_simple_idct_put_mmx
;
c
->
idct_add
=
ff_simple_idct_add_mmx
;
c
->
idct
=
ff_simple_idct_mmx
;
c
->
idct_permutation_type
=
FF_SIMPLE_IDCT_PERM
;
}
else
if
(
idct_algo
==
FF_IDCT_LIBMPEG2MMX
){
if
(
mm_flags
&
MM_MMXEXT
){
c
->
idct_put
=
ff_libmpeg2mmx2_idct_put
;
c
->
idct_add
=
ff_libmpeg2mmx2_idct_add
;
c
->
idct
=
ff_mmxext_idct
;
}
else
{
c
->
idct_put
=
ff_libmpeg2mmx_idct_put
;
c
->
idct_add
=
ff_libmpeg2mmx_idct_add
;
c
->
idct
=
ff_mmx_idct
;
}
c
->
idct_permutation_type
=
FF_LIBMPEG2_IDCT_PERM
;
}
c
->
idct_permutation_type
=
FF_LIBMPEG2_IDCT_PERM
;
}
/* VP3 optimized DSP functions */
...
...
libavcodec/jrevdct.c
View file @
178fcca8
...
...
@@ -1172,5 +1172,461 @@ void j_rev_dct(DCTBLOCK data)
}
}
#undef DCTSIZE
#define DCTSIZE 4
#define DCTSTRIDE 8
void
j_rev_dct4
(
DCTBLOCK
data
)
{
int32_t
tmp0
,
tmp1
,
tmp2
,
tmp3
;
int32_t
tmp10
,
tmp11
,
tmp12
,
tmp13
;
int32_t
z1
;
int32_t
d0
,
d2
,
d4
,
d6
;
register
DCTELEM
*
dataptr
;
int
rowctr
;
/* Pass 1: process rows. */
/* Note results are scaled up by sqrt(8) compared to a true IDCT; */
/* furthermore, we scale the results by 2**PASS1_BITS. */
dataptr
=
data
;
for
(
rowctr
=
DCTSIZE
-
1
;
rowctr
>=
0
;
rowctr
--
)
{
/* Due to quantization, we will usually find that many of the input
* coefficients are zero, especially the AC terms. We can exploit this
* by short-circuiting the IDCT calculation for any row in which all
* the AC terms are zero. In that case each output is equal to the
* DC coefficient (with scale factor as needed).
* With typical images and quantization tables, half or more of the
* row DCT calculations can be simplified this way.
*/
register
int
*
idataptr
=
(
int
*
)
dataptr
;
/* WARNING: we do the same permutation as MMX idct to simplify the
video core */
d0
=
dataptr
[
0
];
d2
=
dataptr
[
1
];
d4
=
dataptr
[
2
];
d6
=
dataptr
[
3
];
if
((
d2
|
d4
|
d6
)
==
0
)
{
/* AC terms all zero */
if
(
d0
)
{
/* Compute a 32 bit value to assign. */
DCTELEM
dcval
=
(
DCTELEM
)
(
d0
<<
PASS1_BITS
);
register
int
v
=
(
dcval
&
0xffff
)
|
((
dcval
<<
16
)
&
0xffff0000
);
idataptr
[
0
]
=
v
;
idataptr
[
1
]
=
v
;
}
dataptr
+=
DCTSTRIDE
;
/* advance pointer to next row */
continue
;
}
/* Even part: reverse the even part of the forward DCT. */
/* The rotator is sqrt(2)*c(-6). */
if
(
d6
)
{
if
(
d4
)
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp0
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp1
=
(
d0
-
d4
)
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp1
+
tmp2
;
tmp12
=
tmp1
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp0
=
d4
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp2
-
tmp0
;
tmp12
=
-
(
tmp0
+
tmp2
);
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp0
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp1
=
(
d0
-
d4
)
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp1
+
tmp2
;
tmp12
=
tmp1
-
tmp2
;
}
else
{
/* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp0
=
d4
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp2
-
tmp0
;
tmp12
=
-
(
tmp0
+
tmp2
);
}
}
}
else
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp0
=
d0
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp0
+
tmp2
;
tmp12
=
tmp0
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp10
=
tmp3
;
tmp13
=
-
tmp3
;
tmp11
=
tmp2
;
tmp12
=
-
tmp2
;
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp0
=
d0
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp0
+
tmp2
;
tmp12
=
tmp0
-
tmp2
;
}
else
{
/* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp10
=
tmp3
;
tmp13
=
-
tmp3
;
tmp11
=
tmp2
;
tmp12
=
-
tmp2
;
}
}
}
}
else
{
if
(
d4
)
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp0
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp1
=
(
d0
-
d4
)
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp1
+
tmp2
;
tmp12
=
tmp1
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp0
=
d4
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp2
-
tmp0
;
tmp12
=
-
(
tmp0
+
tmp2
);
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
tmp10
=
tmp13
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp11
=
tmp12
=
(
d0
-
d4
)
<<
CONST_BITS
;
}
else
{
/* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
tmp10
=
tmp13
=
d4
<<
CONST_BITS
;
tmp11
=
tmp12
=
-
tmp10
;
}
}
}
else
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp0
=
d0
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp0
+
tmp2
;
tmp12
=
tmp0
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp10
=
tmp3
;
tmp13
=
-
tmp3
;
tmp11
=
tmp2
;
tmp12
=
-
tmp2
;
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
tmp10
=
tmp13
=
tmp11
=
tmp12
=
d0
<<
CONST_BITS
;
}
else
{
/* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
tmp10
=
tmp13
=
tmp11
=
tmp12
=
0
;
}
}
}
}
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
dataptr
[
0
]
=
(
DCTELEM
)
DESCALE
(
tmp10
,
CONST_BITS
-
PASS1_BITS
);
dataptr
[
1
]
=
(
DCTELEM
)
DESCALE
(
tmp11
,
CONST_BITS
-
PASS1_BITS
);
dataptr
[
2
]
=
(
DCTELEM
)
DESCALE
(
tmp12
,
CONST_BITS
-
PASS1_BITS
);
dataptr
[
3
]
=
(
DCTELEM
)
DESCALE
(
tmp13
,
CONST_BITS
-
PASS1_BITS
);
dataptr
+=
DCTSTRIDE
;
/* advance pointer to next row */
}
/* Pass 2: process columns. */
/* Note that we must descale the results by a factor of 8 == 2**3, */
/* and also undo the PASS1_BITS scaling. */
dataptr
=
data
;
for
(
rowctr
=
DCTSIZE
-
1
;
rowctr
>=
0
;
rowctr
--
)
{
/* Columns of zeroes can be exploited in the same way as we did with rows.
* However, the row calculation has created many nonzero AC terms, so the
* simplification applies less often (typically 5% to 10% of the time).
* On machines with very fast multiplication, it's possible that the
* test takes more time than it's worth. In that case this section
* may be commented out.
*/
d0
=
dataptr
[
DCTSTRIDE
*
0
];
d2
=
dataptr
[
DCTSTRIDE
*
1
];
d4
=
dataptr
[
DCTSTRIDE
*
2
];
d6
=
dataptr
[
DCTSTRIDE
*
3
];
/* Even part: reverse the even part of the forward DCT. */
/* The rotator is sqrt(2)*c(-6). */
if
(
d6
)
{
if
(
d4
)
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp0
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp1
=
(
d0
-
d4
)
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp1
+
tmp2
;
tmp12
=
tmp1
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp0
=
d4
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp2
-
tmp0
;
tmp12
=
-
(
tmp0
+
tmp2
);
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp0
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp1
=
(
d0
-
d4
)
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp1
+
tmp2
;
tmp12
=
tmp1
-
tmp2
;
}
else
{
/* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp0
=
d4
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp2
-
tmp0
;
tmp12
=
-
(
tmp0
+
tmp2
);
}
}
}
else
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp0
=
d0
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp0
+
tmp2
;
tmp12
=
tmp0
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
z1
=
MULTIPLY
(
d2
+
d6
,
FIX_0_541196100
);
tmp2
=
z1
+
MULTIPLY
(
-
d6
,
FIX_1_847759065
);
tmp3
=
z1
+
MULTIPLY
(
d2
,
FIX_0_765366865
);
tmp10
=
tmp3
;
tmp13
=
-
tmp3
;
tmp11
=
tmp2
;
tmp12
=
-
tmp2
;
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp0
=
d0
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp0
+
tmp2
;
tmp12
=
tmp0
-
tmp2
;
}
else
{
/* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
tmp2
=
MULTIPLY
(
-
d6
,
FIX_1_306562965
);
tmp3
=
MULTIPLY
(
d6
,
FIX_0_541196100
);
tmp10
=
tmp3
;
tmp13
=
-
tmp3
;
tmp11
=
tmp2
;
tmp12
=
-
tmp2
;
}
}
}
}
else
{
if
(
d4
)
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp0
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp1
=
(
d0
-
d4
)
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp1
+
tmp2
;
tmp12
=
tmp1
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp0
=
d4
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp2
-
tmp0
;
tmp12
=
-
(
tmp0
+
tmp2
);
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
tmp10
=
tmp13
=
(
d0
+
d4
)
<<
CONST_BITS
;
tmp11
=
tmp12
=
(
d0
-
d4
)
<<
CONST_BITS
;
}
else
{
/* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
tmp10
=
tmp13
=
d4
<<
CONST_BITS
;
tmp11
=
tmp12
=
-
tmp10
;
}
}
}
else
{
if
(
d2
)
{
if
(
d0
)
{
/* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp0
=
d0
<<
CONST_BITS
;
tmp10
=
tmp0
+
tmp3
;
tmp13
=
tmp0
-
tmp3
;
tmp11
=
tmp0
+
tmp2
;
tmp12
=
tmp0
-
tmp2
;
}
else
{
/* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
tmp2
=
MULTIPLY
(
d2
,
FIX_0_541196100
);
tmp3
=
MULTIPLY
(
d2
,
FIX_1_306562965
);
tmp10
=
tmp3
;
tmp13
=
-
tmp3
;
tmp11
=
tmp2
;
tmp12
=
-
tmp2
;
}
}
else
{
if
(
d0
)
{
/* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
tmp10
=
tmp13
=
tmp11
=
tmp12
=
d0
<<
CONST_BITS
;
}
else
{
/* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
tmp10
=
tmp13
=
tmp11
=
tmp12
=
0
;
}
}
}
}
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
dataptr
[
DCTSTRIDE
*
0
]
=
(
DCTELEM
)
DESCALE
(
tmp10
,
CONST_BITS
+
PASS1_BITS
+
3
);
dataptr
[
DCTSTRIDE
*
1
]
=
(
DCTELEM
)
DESCALE
(
tmp11
,
CONST_BITS
+
PASS1_BITS
+
3
);
dataptr
[
DCTSTRIDE
*
2
]
=
(
DCTELEM
)
DESCALE
(
tmp12
,
CONST_BITS
+
PASS1_BITS
+
3
);
dataptr
[
DCTSTRIDE
*
3
]
=
(
DCTELEM
)
DESCALE
(
tmp13
,
CONST_BITS
+
PASS1_BITS
+
3
);
dataptr
++
;
/* advance pointer to next column */
}
}
#undef FIX
#undef CONST_BITS
libavcodec/mpeg12.c
View file @
178fcca8
...
...
@@ -2409,6 +2409,7 @@ static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y,
AVCodecContext
*
avctx
=
s
->
avctx
;
int
ret
;
const
int
field_pic
=
s
->
picture_structure
!=
PICT_FRAME
;
const
int
lowres
=
s
->
avctx
->
lowres
;
s
->
resync_mb_x
=
s
->
resync_mb_y
=
-
1
;
...
...
@@ -2518,9 +2519,9 @@ static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y,
}
}
s
->
dest
[
0
]
+=
16
;
s
->
dest
[
1
]
+=
16
>>
s
->
chroma_x_shift
;
s
->
dest
[
2
]
+=
16
>>
s
->
chroma_x_shift
;
s
->
dest
[
0
]
+=
16
>>
lowres
;
s
->
dest
[
1
]
+=
16
>>
(
s
->
chroma_x_shift
+
lowres
)
;
s
->
dest
[
2
]
+=
16
>>
(
s
->
chroma_x_shift
+
lowres
)
;
MPV_decode_mb
(
s
,
s
->
block
);
...
...
libavcodec/mpegvideo.c
View file @
178fcca8
...
...
@@ -2607,6 +2607,82 @@ if(s->quarter_sample)
pix_op
[
s
->
chroma_x_shift
][
uvdxy
](
dest_cr
,
ptr_cr
,
uvlinesize
,
h
>>
s
->
chroma_y_shift
);
}
}
/* apply one mpeg motion vector to the three components */
static
always_inline
void
mpeg_motion_lowres
(
MpegEncContext
*
s
,
uint8_t
*
dest_y
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
,
int
field_based
,
int
bottom_field
,
int
field_select
,
uint8_t
**
ref_picture
,
h264_chroma_mc_func
*
pix_op
,
int
motion_x
,
int
motion_y
,
int
h
)
{
uint8_t
*
ptr_y
,
*
ptr_cb
,
*
ptr_cr
;
int
mx
,
my
,
src_x
,
src_y
,
uvsrc_x
,
uvsrc_y
,
uvlinesize
,
linesize
,
sx
,
sy
,
uvsx
,
uvsy
;
const
int
lowres
=
s
->
avctx
->
lowres
;
const
int
block_s
=
8
>>
lowres
;
const
int
s_mask
=
(
2
<<
lowres
)
-
1
;
const
int
h_edge_pos
=
s
->
h_edge_pos
>>
lowres
;
const
int
v_edge_pos
=
s
->
v_edge_pos
>>
lowres
;
linesize
=
s
->
current_picture
.
linesize
[
0
]
<<
field_based
;
uvlinesize
=
s
->
current_picture
.
linesize
[
1
]
<<
field_based
;
sx
=
motion_x
&
s_mask
;
sy
=
motion_y
&
s_mask
;
src_x
=
s
->
mb_x
*
2
*
block_s
+
(
motion_x
>>
(
lowres
+
1
));
src_y
=
s
->
mb_y
*
2
*
block_s
+
(
motion_y
>>
(
lowres
+
1
));
if
(
s
->
out_format
==
FMT_H263
)
{
uvsx
=
sx
|
((
motion_x
&
2
)
>>
1
);
uvsy
=
sy
|
((
motion_y
&
2
)
>>
1
);
uvsrc_x
=
src_x
>>
1
;
uvsrc_y
=
src_y
>>
1
;
}
else
if
(
s
->
out_format
==
FMT_H261
){
//even chroma mv's are full pel in H261
mx
=
motion_x
/
4
;
my
=
motion_y
/
4
;
uvsx
=
(
2
*
mx
)
&
s_mask
;
uvsy
=
(
2
*
my
)
&
s_mask
;
uvsrc_x
=
s
->
mb_x
*
block_s
+
(
mx
>>
lowres
);
uvsrc_y
=
s
->
mb_y
*
block_s
+
(
my
>>
lowres
);
}
else
{
mx
=
motion_x
/
2
;
my
=
motion_y
/
2
;
uvsx
=
mx
&
s_mask
;
uvsy
=
my
&
s_mask
;
uvsrc_x
=
s
->
mb_x
*
block_s
+
(
mx
>>
(
lowres
+
1
));
uvsrc_y
=
s
->
mb_y
*
block_s
+
(
my
>>
(
lowres
+
1
));
}
ptr_y
=
ref_picture
[
0
]
+
src_y
*
linesize
+
src_x
;
ptr_cb
=
ref_picture
[
1
]
+
uvsrc_y
*
uvlinesize
+
uvsrc_x
;
ptr_cr
=
ref_picture
[
2
]
+
uvsrc_y
*
uvlinesize
+
uvsrc_x
;
if
(
(
unsigned
)
src_x
>
h_edge_pos
-
(
!!
sx
)
-
2
*
block_s
||
(
unsigned
)
src_y
>
(
v_edge_pos
>>
field_based
)
-
(
!!
sy
)
-
h
){
ff_emulated_edge_mc
(
s
->
edge_emu_buffer
,
ptr_y
,
s
->
linesize
,
17
,
17
+
field_based
,
src_x
,
src_y
<<
field_based
,
h_edge_pos
,
v_edge_pos
);
ptr_y
=
s
->
edge_emu_buffer
;
if
(
!
(
s
->
flags
&
CODEC_FLAG_GRAY
)){
uint8_t
*
uvbuf
=
s
->
edge_emu_buffer
+
18
*
s
->
linesize
;
ff_emulated_edge_mc
(
uvbuf
,
ptr_cb
,
s
->
uvlinesize
,
9
,
9
+
field_based
,
uvsrc_x
,
uvsrc_y
<<
field_based
,
h_edge_pos
>>
1
,
v_edge_pos
>>
1
);
ff_emulated_edge_mc
(
uvbuf
+
16
,
ptr_cr
,
s
->
uvlinesize
,
9
,
9
+
field_based
,
uvsrc_x
,
uvsrc_y
<<
field_based
,
h_edge_pos
>>
1
,
v_edge_pos
>>
1
);
ptr_cb
=
uvbuf
;
ptr_cr
=
uvbuf
+
16
;
}
}
sx
<<=
2
-
lowres
;
sy
<<=
2
-
lowres
;
pix_op
[
lowres
-
1
](
dest_y
,
ptr_y
,
linesize
,
h
,
sx
,
sy
);
if
(
!
(
s
->
flags
&
CODEC_FLAG_GRAY
)){
uvsx
<<=
2
-
lowres
;
uvsy
<<=
2
-
lowres
;
pix_op
[
lowres
](
dest_cb
,
ptr_cb
,
uvlinesize
,
h
>>
s
->
chroma_y_shift
,
uvsx
,
uvsy
);
pix_op
[
lowres
](
dest_cr
,
ptr_cr
,
uvlinesize
,
h
>>
s
->
chroma_y_shift
,
uvsx
,
uvsy
);
}
}
//FIXME move to dsputil, avg variant, 16x16 version
static
inline
void
put_obmc
(
uint8_t
*
dst
,
uint8_t
*
src
[
5
],
int
stride
){
int
x
;
...
...
@@ -3085,6 +3161,28 @@ static inline void MPV_motion(MpegEncContext *s,
}
}
/**
* motion compesation of a single macroblock
* @param s context
* @param dest_y luma destination pointer
* @param dest_cb chroma cb/u destination pointer
* @param dest_cr chroma cr/v destination pointer
* @param dir direction (0->forward, 1->backward)
* @param ref_picture array[3] of pointers to the 3 planes of the reference picture
* @param pic_op halfpel motion compensation function (average or put normally)
* the motion vectors are taken from s->mv and the MV type from s->mv_type
*/
static
inline
void
MPV_motion_lowres
(
MpegEncContext
*
s
,
uint8_t
*
dest_y
,
uint8_t
*
dest_cb
,
uint8_t
*
dest_cr
,
int
dir
,
uint8_t
**
ref_picture
,
h264_chroma_mc_func
*
pix_op
)
{
assert
(
s
->
mv_type
==
MV_TYPE_16X16
);
mpeg_motion_lowres
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
0
,
0
,
0
,
ref_picture
,
pix_op
,
s
->
mv
[
dir
][
0
][
0
],
s
->
mv
[
dir
][
0
][
1
],
16
>>
s
->
avctx
->
lowres
);
}
/* put block[] to dest[] */
static
inline
void
put_dct
(
MpegEncContext
*
s
,
...
...
@@ -3156,7 +3254,7 @@ void ff_clean_intra_table_entries(MpegEncContext *s)
s->mv : motion vector
s->interlaced_dct : true if interlaced dct used (mpeg2)
*/
void
MPV_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
]
)
static
always_inline
void
MPV_decode_mb_internal
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
],
int
lowres_flag
)
{
int
mb_x
,
mb_y
;
const
int
mb_xy
=
s
->
mb_y
*
s
->
mb_stride
+
s
->
mb_x
;
...
...
@@ -3202,7 +3300,8 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
qpel_mc_func
(
*
op_qpix
)[
16
];
const
int
linesize
=
s
->
current_picture
.
linesize
[
0
];
//not s->linesize as this woulnd be wrong for field pics
const
int
uvlinesize
=
s
->
current_picture
.
linesize
[
1
];
const
int
readable
=
s
->
pict_type
!=
B_TYPE
||
s
->
encoding
||
s
->
avctx
->
draw_horiz_band
;
const
int
readable
=
s
->
pict_type
!=
B_TYPE
||
s
->
encoding
||
s
->
avctx
->
draw_horiz_band
||
lowres_flag
;
const
int
block_size
=
lowres_flag
?
8
>>
s
->
avctx
->
lowres
:
8
;
/* avoid copy if macroblock skipped in last frame too */
/* skip only during decoding as we might trash the buffers during encoding a bit */
...
...
@@ -3230,10 +3329,10 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
*
mbskip_ptr
=
0
;
/* not skipped */
}
}
dct_linesize
=
linesize
<<
s
->
interlaced_dct
;
dct_offset
=
(
s
->
interlaced_dct
)
?
linesize
:
linesize
*
8
;
dct_offset
=
(
s
->
interlaced_dct
)
?
linesize
:
linesize
*
block_size
;
if
(
readable
){
dest_y
=
s
->
dest
[
0
];
dest_cb
=
s
->
dest
[
1
];
...
...
@@ -3243,25 +3342,37 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
dest_cb
=
s
->
b_scratchpad
+
16
*
linesize
;
dest_cr
=
s
->
b_scratchpad
+
32
*
linesize
;
}
if
(
!
s
->
mb_intra
)
{
/* motion handling */
/* decoding or more than one mb_type (MC was allready done otherwise) */
if
(
!
s
->
encoding
){
if
((
!
s
->
no_rounding
)
||
s
->
pict_type
==
B_TYPE
){
op_pix
=
s
->
dsp
.
put_pixels_tab
;
op_qpix
=
s
->
dsp
.
put_qpel_pixels_tab
;
}
else
{
op_pix
=
s
->
dsp
.
put_no_rnd_pixels_tab
;
op_qpix
=
s
->
dsp
.
put_no_rnd_qpel_pixels_tab
;
}
if
(
lowres_flag
){
h264_chroma_mc_func
*
op_pix
=
s
->
dsp
.
put_h264_chroma_pixels_tab
;
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
)
{
MPV_motion
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
0
,
s
->
last_picture
.
data
,
op_pix
,
op_qpix
);
op_pix
=
s
->
dsp
.
avg_pixels_tab
;
op_qpix
=
s
->
dsp
.
avg_qpel_pixels_tab
;
}
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
)
{
MPV_motion
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
1
,
s
->
next_picture
.
data
,
op_pix
,
op_qpix
);
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
)
{
MPV_motion_lowres
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
0
,
s
->
last_picture
.
data
,
op_pix
);
op_pix
=
s
->
dsp
.
avg_h264_chroma_pixels_tab
;
}
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
)
{
MPV_motion_lowres
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
1
,
s
->
next_picture
.
data
,
op_pix
);
}
}
else
{
if
((
!
s
->
no_rounding
)
||
s
->
pict_type
==
B_TYPE
){
op_pix
=
s
->
dsp
.
put_pixels_tab
;
op_qpix
=
s
->
dsp
.
put_qpel_pixels_tab
;
}
else
{
op_pix
=
s
->
dsp
.
put_no_rnd_pixels_tab
;
op_qpix
=
s
->
dsp
.
put_no_rnd_qpel_pixels_tab
;
}
if
(
s
->
mv_dir
&
MV_DIR_FORWARD
)
{
MPV_motion
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
0
,
s
->
last_picture
.
data
,
op_pix
,
op_qpix
);
op_pix
=
s
->
dsp
.
avg_pixels_tab
;
op_qpix
=
s
->
dsp
.
avg_qpel_pixels_tab
;
}
if
(
s
->
mv_dir
&
MV_DIR_BACKWARD
)
{
MPV_motion
(
s
,
dest_y
,
dest_cb
,
dest_cr
,
1
,
s
->
next_picture
.
data
,
op_pix
,
op_qpix
);
}
}
}
...
...
@@ -3271,20 +3382,20 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
/* add dct residue */
if
(
s
->
encoding
||
!
(
s
->
h263_msmpeg4
||
s
->
codec_id
==
CODEC_ID_MPEG1VIDEO
||
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
||
(
s
->
codec_id
==
CODEC_ID_MPEG4
&&
!
s
->
mpeg_quant
))){
add_dequant_dct
(
s
,
block
[
0
],
0
,
dest_y
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
1
],
1
,
dest_y
+
8
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
2
],
2
,
dest_y
+
dct_offset
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
3
],
3
,
dest_y
+
dct_offset
+
8
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
0
],
0
,
dest_y
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
1
],
1
,
dest_y
+
block_size
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
2
],
2
,
dest_y
+
dct_offset
,
dct_linesize
,
s
->
qscale
);
add_dequant_dct
(
s
,
block
[
3
],
3
,
dest_y
+
dct_offset
+
block_size
,
dct_linesize
,
s
->
qscale
);
if
(
!
(
s
->
flags
&
CODEC_FLAG_GRAY
)){
add_dequant_dct
(
s
,
block
[
4
],
4
,
dest_cb
,
uvlinesize
,
s
->
chroma_qscale
);
add_dequant_dct
(
s
,
block
[
5
],
5
,
dest_cr
,
uvlinesize
,
s
->
chroma_qscale
);
}
}
else
if
(
s
->
codec_id
!=
CODEC_ID_WMV2
){
add_dct
(
s
,
block
[
0
],
0
,
dest_y
,
dct_linesize
);
add_dct
(
s
,
block
[
1
],
1
,
dest_y
+
8
,
dct_linesize
);
add_dct
(
s
,
block
[
2
],
2
,
dest_y
+
dct_offset
,
dct_linesize
);
add_dct
(
s
,
block
[
3
],
3
,
dest_y
+
dct_offset
+
8
,
dct_linesize
);
add_dct
(
s
,
block
[
0
],
0
,
dest_y
,
dct_linesize
);
add_dct
(
s
,
block
[
1
],
1
,
dest_y
+
block_size
,
dct_linesize
);
add_dct
(
s
,
block
[
2
],
2
,
dest_y
+
dct_offset
,
dct_linesize
);
add_dct
(
s
,
block
[
3
],
3
,
dest_y
+
dct_offset
+
block_size
,
dct_linesize
);
if
(
!
(
s
->
flags
&
CODEC_FLAG_GRAY
)){
if
(
s
->
chroma_y_shift
){
//Chroma420
...
...
@@ -3316,20 +3427,20 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
}
else
{
/* dct only in intra block */
if
(
s
->
encoding
||
!
(
s
->
codec_id
==
CODEC_ID_MPEG1VIDEO
||
s
->
codec_id
==
CODEC_ID_MPEG2VIDEO
)){
put_dct
(
s
,
block
[
0
],
0
,
dest_y
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
1
],
1
,
dest_y
+
8
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
2
],
2
,
dest_y
+
dct_offset
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
3
],
3
,
dest_y
+
dct_offset
+
8
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
0
],
0
,
dest_y
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
1
],
1
,
dest_y
+
block_size
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
2
],
2
,
dest_y
+
dct_offset
,
dct_linesize
,
s
->
qscale
);
put_dct
(
s
,
block
[
3
],
3
,
dest_y
+
dct_offset
+
block_size
,
dct_linesize
,
s
->
qscale
);
if
(
!
(
s
->
flags
&
CODEC_FLAG_GRAY
)){
put_dct
(
s
,
block
[
4
],
4
,
dest_cb
,
uvlinesize
,
s
->
chroma_qscale
);
put_dct
(
s
,
block
[
5
],
5
,
dest_cr
,
uvlinesize
,
s
->
chroma_qscale
);
}
}
else
{
s
->
dsp
.
idct_put
(
dest_y
,
dct_linesize
,
block
[
0
]);
s
->
dsp
.
idct_put
(
dest_y
+
8
,
dct_linesize
,
block
[
1
]);
s
->
dsp
.
idct_put
(
dest_y
+
dct_offset
,
dct_linesize
,
block
[
2
]);
s
->
dsp
.
idct_put
(
dest_y
+
dct_offset
+
8
,
dct_linesize
,
block
[
3
]);
s
->
dsp
.
idct_put
(
dest_y
,
dct_linesize
,
block
[
0
]);
s
->
dsp
.
idct_put
(
dest_y
+
block_size
,
dct_linesize
,
block
[
1
]);
s
->
dsp
.
idct_put
(
dest_y
+
dct_offset
,
dct_linesize
,
block
[
2
]);
s
->
dsp
.
idct_put
(
dest_y
+
dct_offset
+
block_size
,
dct_linesize
,
block
[
3
]);
if
(
!
(
s
->
flags
&
CODEC_FLAG_GRAY
)){
if
(
s
->
chroma_y_shift
){
...
...
@@ -3362,6 +3473,11 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
}
}
void
MPV_decode_mb
(
MpegEncContext
*
s
,
DCTELEM
block
[
12
][
64
]){
if
(
s
->
avctx
->
lowres
)
MPV_decode_mb_internal
(
s
,
block
,
1
);
else
MPV_decode_mb_internal
(
s
,
block
,
0
);
}
#ifdef CONFIG_ENCODERS
static
inline
void
dct_single_coeff_elimination
(
MpegEncContext
*
s
,
int
n
,
int
threshold
)
...
...
@@ -3492,6 +3608,7 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
void
ff_init_block_index
(
MpegEncContext
*
s
){
//FIXME maybe rename
const
int
linesize
=
s
->
current_picture
.
linesize
[
0
];
//not s->linesize as this woulnd be wrong for field pics
const
int
uvlinesize
=
s
->
current_picture
.
linesize
[
1
];
const
int
mb_size
=
4
-
s
->
avctx
->
lowres
;
s
->
block_index
[
0
]
=
s
->
b8_stride
*
(
s
->
mb_y
*
2
)
-
2
+
s
->
mb_x
*
2
;
s
->
block_index
[
1
]
=
s
->
b8_stride
*
(
s
->
mb_y
*
2
)
-
1
+
s
->
mb_x
*
2
;
...
...
@@ -3501,15 +3618,15 @@ void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
s
->
block_index
[
5
]
=
s
->
mb_stride
*
(
s
->
mb_y
+
s
->
mb_height
+
2
)
+
s
->
b8_stride
*
s
->
mb_height
*
2
+
s
->
mb_x
-
1
;
//block_index is not used by mpeg2, so it is not affected by chroma_format
s
->
dest
[
0
]
=
s
->
current_picture
.
data
[
0
]
+
((
s
->
mb_x
-
1
)
<<
4
);
s
->
dest
[
1
]
=
s
->
current_picture
.
data
[
1
]
+
((
s
->
mb_x
-
1
)
<<
(
4
-
s
->
chroma_x_shift
));
s
->
dest
[
2
]
=
s
->
current_picture
.
data
[
2
]
+
((
s
->
mb_x
-
1
)
<<
(
4
-
s
->
chroma_x_shift
));
s
->
dest
[
0
]
=
s
->
current_picture
.
data
[
0
]
+
((
s
->
mb_x
-
1
)
<<
mb_size
);
s
->
dest
[
1
]
=
s
->
current_picture
.
data
[
1
]
+
((
s
->
mb_x
-
1
)
<<
(
mb_size
-
s
->
chroma_x_shift
));
s
->
dest
[
2
]
=
s
->
current_picture
.
data
[
2
]
+
((
s
->
mb_x
-
1
)
<<
(
mb_size
-
s
->
chroma_x_shift
));
if
(
!
(
s
->
pict_type
==
B_TYPE
&&
s
->
avctx
->
draw_horiz_band
&&
s
->
picture_structure
==
PICT_FRAME
))
{
s
->
dest
[
0
]
+=
s
->
mb_y
*
linesize
<<
4
;
s
->
dest
[
1
]
+=
s
->
mb_y
*
uvlinesize
<<
(
4
-
s
->
chroma_y_shift
);
s
->
dest
[
2
]
+=
s
->
mb_y
*
uvlinesize
<<
(
4
-
s
->
chroma_y_shift
);
s
->
dest
[
0
]
+=
s
->
mb_y
*
linesize
<<
mb_size
;
s
->
dest
[
1
]
+=
s
->
mb_y
*
uvlinesize
<<
(
mb_size
-
s
->
chroma_y_shift
);
s
->
dest
[
2
]
+=
s
->
mb_y
*
uvlinesize
<<
(
mb_size
-
s
->
chroma_y_shift
);
}
}
...
...
libavcodec/mpegvideo.h
View file @
178fcca8
...
...
@@ -773,15 +773,17 @@ extern enum PixelFormat ff_yuv420p_list[2];
void
ff_init_block_index
(
MpegEncContext
*
s
);
static
inline
void
ff_update_block_index
(
MpegEncContext
*
s
){
const
int
block_size
=
8
>>
s
->
avctx
->
lowres
;
s
->
block_index
[
0
]
+=
2
;
s
->
block_index
[
1
]
+=
2
;
s
->
block_index
[
2
]
+=
2
;
s
->
block_index
[
3
]
+=
2
;
s
->
block_index
[
4
]
++
;
s
->
block_index
[
5
]
++
;
s
->
dest
[
0
]
+=
16
;
s
->
dest
[
1
]
+=
8
;
s
->
dest
[
2
]
+=
8
;
s
->
dest
[
0
]
+=
2
*
block_size
;
s
->
dest
[
1
]
+=
block_size
;
s
->
dest
[
2
]
+=
block_size
;
}
static
inline
int
get_bits_diff
(
MpegEncContext
*
s
){
...
...
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