Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
730460c0
Commit
730460c0
authored
Nov 12, 2003
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* all: big clean up (no more global variables).
parent
c7bc1acb
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1390 additions
and
1388 deletions
+1390
-1388
modules/stream_out/transrate/getvlc.h
modules/stream_out/transrate/getvlc.h
+2
-6
modules/stream_out/transrate/transrate.c
modules/stream_out/transrate/transrate.c
+1388
-1382
No files found.
modules/stream_out/transrate/getvlc.h
View file @
730460c0
...
...
@@ -20,15 +20,11 @@
#define BOTTOM_FIELD 2
#define FRAME_PICTURE 3
/* remove num valid bits from bit_buf */
#define DUMPBITS(bit_buf,bits,num) Flush_Bits(num)
#define COPYBITS(bit_buf,bits,num) Copy_Bits(num)
/* take num bits from the high part of bit_buf and zero extend them */
#define UBITS(bit_buf,num) (((uint32_t)(
inbitbuf
)) >> (32 - (num)))
#define UBITS(bit_buf,num) (((uint32_t)(
bs->i_bit_in_cache
)) >> (32 - (num)))
/* take num bits from the high part of bit_buf and sign extend them */
#define SBITS(bit_buf,num) (((int32_t)(
inbitbuf
)) >> (32 - (num)))
#define SBITS(bit_buf,num) (((int32_t)(
bs->i_bit_in_cache
)) >> (32 - (num)))
typedef
struct
{
uint8_t
modes
;
...
...
modules/stream_out/transrate/transrate.c
View file @
730460c0
...
...
@@ -6,9 +6,10 @@
* Copyright (C) 2003 Antoine Missout
* Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
* Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
* $Id: transrate.c,v 1.
1 2003/11/07 21:30:52 massiot
Exp $
* $Id: transrate.c,v 1.
2 2003/11/12 18:13:31 fenrir
Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.fr>
* Antoine Missout
* Michel Lespinasse <walken@zoy.org>
* Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
...
...
@@ -33,18 +34,13 @@
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NDEBUG 1
#include <assert.h>
#include <unistd.h>
#include <math.h>
#include <fcntl.h>
#include <vlc/vlc.h>
#include <vlc/input.h>
#include <vlc/sout.h>
#include <vlc/vout.h>
#include <vlc/decoder.h>
#include <vlc/input.h>
/*****************************************************************************
* Exported prototypes
...
...
@@ -56,8 +52,6 @@ static sout_stream_id_t *Add ( sout_stream_t *, sout_format_t * );
static
int
Del
(
sout_stream_t
*
,
sout_stream_id_t
*
);
static
int
Send
(
sout_stream_t
*
,
sout_stream_id_t
*
,
sout_buffer_t
*
);
static
int
transrate_video_new
(
sout_stream_t
*
,
sout_stream_id_t
*
);
static
void
transrate_video_close
(
sout_stream_t
*
,
sout_stream_id_t
*
);
static
int
transrate_video_process
(
sout_stream_t
*
,
sout_stream_id_t
*
,
sout_buffer_t
*
,
sout_buffer_t
**
);
/*****************************************************************************
...
...
@@ -140,6 +134,70 @@ static void Close( vlc_object_t * p_this )
free
(
p_sys
);
}
/*****************************************************************************
* sout_stream_id_t:
*****************************************************************************/
typedef
struct
{
uint8_t
run
;
short
level
;
}
RunLevel
;
typedef
struct
{
uint8_t
*
p_c
;
uint8_t
*
p_r
;
uint8_t
*
p_w
;
uint8_t
*
p_ow
;
uint8_t
*
p_rw
;
int
i_bit_in
;
int
i_bit_out
;
uint32_t
i_bit_in_cache
;
uint32_t
i_bit_out_cache
;
uint32_t
i_byte_in
;
uint32_t
i_byte_out
;
}
bs_transrate_t
;
typedef
struct
{
bs_transrate_t
bs
;
/* MPEG2 state */
// seq header
unsigned
int
horizontal_size_value
;
unsigned
int
vertical_size_value
;
// pic header
unsigned
int
picture_coding_type
;
// pic code ext
unsigned
int
f_code
[
2
][
2
];
/* unsigned int intra_dc_precision; */
unsigned
int
picture_structure
;
unsigned
int
frame_pred_frame_dct
;
unsigned
int
concealment_motion_vectors
;
unsigned
int
q_scale_type
;
unsigned
int
intra_vlc_format
;
/* unsigned int alternate_scan; */
// slice or mb
// quantizer_scale_code
unsigned
int
quantizer_scale
;
unsigned
int
new_quantizer_scale
;
unsigned
int
last_coded_scale
;
int
h_offset
,
v_offset
;
// mb
double
quant_corr
,
fact_x
;
}
transrate_t
;
struct
sout_stream_id_t
{
void
*
id
;
...
...
@@ -149,6 +207,8 @@ struct sout_stream_id_t
sout_buffer_t
*
p_next_gop
;
mtime_t
i_next_gop_duration
;
size_t
i_next_gop_size
;
transrate_t
tr
;
};
...
...
@@ -167,13 +227,14 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, sout_format_t *p_fmt )
"creating video transrating for fcc=`%4.4s'"
,
(
char
*
)
&
p_fmt
->
i_fourcc
);
/* build decoder -> filter -> encoder */
if
(
transrate_video_new
(
p_stream
,
id
)
)
{
msg_Err
(
p_stream
,
"cannot create video chain"
);
free
(
id
);
return
NULL
;
}
id
->
p_current_buffer
=
NULL
;
id
->
p_next_gop
=
NULL
;
id
->
i_next_gop_duration
=
0
;
id
->
i_next_gop_size
=
0
;
memset
(
&
id
->
tr
,
0
,
sizeof
(
transrate_t
)
);
id
->
tr
.
bs
.
i_byte_in
=
id
->
tr
.
bs
.
i_byte_out
=
0
;
id
->
tr
.
quant_corr
=
0
.
0
;
id
->
tr
.
fact_x
=
1
.
0
;
/* open output stream */
id
->
id
=
p_sys
->
p_out
->
pf_add
(
p_sys
->
p_out
,
p_fmt
);
...
...
@@ -199,12 +260,10 @@ static int Del ( sout_stream_t *p_stream, sout_stream_id_t *id )
{
sout_stream_sys_t
*
p_sys
=
p_stream
->
p_sys
;
if
(
id
->
b_transrate
)
if
(
id
->
id
)
{
transrate_video_close
(
p_stream
,
id
);
p_sys
->
p_out
->
pf_del
(
p_sys
->
p_out
,
id
->
id
);
}
if
(
id
->
id
)
p_sys
->
p_out
->
pf_del
(
p_sys
->
p_out
,
id
->
id
);
free
(
id
);
return
VLC_SUCCESS
;
...
...
@@ -243,12 +302,6 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
// toggles:
// #define NDEBUG // turns off asserts
#define REMOVE_BYTE_STUFFING // removes 0x 00 00 00 00 00 00 used in cbr streams (look for 6 0x00 and remove 1 0x00)
/* 4 0x00 might be legit, for exemple:
00 00 01 b5 14 82 00 01 00 00 00 00 01 b8 .. ..
these two: -- -- are part of the seq. header ext.
AFAIK 5 0x00 should never happen except for byte stuffing but to be safe look for 6 */
/* This is awful magic --Meuuh */
//#define REACT_DELAY (1024.0*128.0)
#define REACT_DELAY (1024.0*4.0)
...
...
@@ -256,12 +309,12 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
// notes:
//
// - intra block:
//
- the quantiser is increment by one step
//
- the quantiser is increment by one step
//
// - non intra block:
//
- in P_FRAME we keep the original quantiser but drop the last coefficient
//
if there is more than one
//
- in B_FRAME we multiply the quantiser by a factor
//
- in P_FRAME we keep the original quantiser but drop the last coefficient
//
if there is more than one
//
- in B_FRAME we multiply the quantiser by a factor
//
// - I_FRAME is recoded when we're 5.0 * REACT_DELAY late
// - P_FRAME is recoded when we're 2.5 * REACT_DELAY late
...
...
@@ -273,9 +326,13 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
// - drop a few coefficients but always keep the first one
// useful constants
#define I_TYPE 1
#define P_TYPE 2
#define B_TYPE 3
enum
{
I_TYPE
=
1
,
P_TYPE
=
2
,
B_TYPE
=
3
};
// gcc
#ifdef HAVE_BUILTIN_EXPECT
...
...
@@ -286,363 +343,266 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
#define unlikely(x) (x)
#endif
// user defined types
//typedef unsigned int uint;
typedef
unsigned
char
uint8
;
typedef
unsigned
short
uint16
;
typedef
unsigned
int
uint32
;
typedef
unsigned
long
long
uint64
;
typedef
char
int8
;
typedef
short
int16
;
typedef
int
int32
;
typedef
long
long
int64
;
typedef
signed
int
sint
;
typedef
signed
char
sint8
;
typedef
signed
short
sint16
;
typedef
signed
int
sint32
;
typedef
signed
long
long
sint64
;
#define BITS_IN_BUF (8)
// global variables
static
uint8
*
cbuf
,
*
rbuf
,
*
wbuf
,
*
orbuf
,
*
owbuf
,
*
rwbuf
;
static
int
inbitcnt
,
outbitcnt
;
static
uint32
inbitbuf
,
outbitbuf
;
static
uint32
inbytecnt
,
outbytecnt
;
static
struct
sout_stream_sys_t
*
p_sys
;
// mpeg2 state
// seq header
static
uint
horizontal_size_value
;
static
uint
vertical_size_value
;
// pic header
static
uint
picture_coding_type
;
// pic code ext
static
uint
f_code
[
2
][
2
];
static
uint
intra_dc_precision
;
static
uint
picture_structure
;
static
uint
frame_pred_frame_dct
;
static
uint
concealment_motion_vectors
;
static
uint
q_scale_type
;
static
uint
intra_vlc_format
;
static
uint
alternate_scan
;
// slice or mb
// quantizer_scale_code
static
uint
quantizer_scale
;
static
uint
new_quantizer_scale
;
static
uint
last_coded_scale
;
static
int
h_offset
,
v_offset
;
// mb
static
double
quant_corr
,
fact_x
;
// block data
typedef
struct
{
uint8
run
;
short
level
;
}
RunLevel
;
static
RunLevel
block
[
6
][
65
];
// terminated by level = 0, so we need 64+1
// end mpeg2 state
#define LOG(msg) fprintf (stderr, msg)
#define LOGF(format, args...) fprintf (stderr, format, args)
#define WRITE \
do { } while(0);
#define LOCK(x) \
do { } while(0);
static
inline
void
bs_write
(
bs_transrate_t
*
s
,
unsigned
int
val
,
int
n
)
{
assert
(
n
<
32
);
assert
(
!
(
val
&
(
0xffffffffU
<<
n
)));
#define COPY(x)\
assert(x > 0); \
memcpy(wbuf, cbuf, x);\
cbuf += x; \
wbuf += x;
while
(
unlikely
(
n
>=
s
->
i_bit_out
))
{
s
->
p_w
[
0
]
=
(
s
->
i_bit_out_cache
<<
s
->
i_bit_out
)
|
(
val
>>
(
n
-
s
->
i_bit_out
));
s
->
p_w
++
;
n
-=
s
->
i_bit_out
;
s
->
i_bit_out_cache
=
0
;
val
&=
~
(
0xffffffffU
<<
n
);
s
->
i_bit_out
=
BITS_IN_BUF
;
}
#define SEEKR(x)\
cbuf += x;
#define SEEKW(x)\
wbuf += x;
if
(
likely
(
n
))
{
s
->
i_bit_out_cache
=
(
s
->
i_bit_out_cache
<<
n
)
|
val
;
s
->
i_bit_out
-=
n
;
}
static
inline
void
putbits
(
uint
val
,
int
n
)
{
assert
(
n
<
32
);
assert
(
!
(
val
&
(
0xffffffffU
<<
n
)));
while
(
unlikely
(
n
>=
outbitcnt
))
{
wbuf
[
0
]
=
(
outbitbuf
<<
outbitcnt
)
|
(
val
>>
(
n
-
outbitcnt
));
SEEKW
(
1
);
n
-=
outbitcnt
;
outbitbuf
=
0
;
val
&=
~
(
0xffffffffU
<<
n
);
outbitcnt
=
BITS_IN_BUF
;
}
if
(
likely
(
n
))
{
outbitbuf
=
(
outbitbuf
<<
n
)
|
val
;
outbitcnt
-=
n
;
}
assert
(
outbitcnt
>
0
);
assert
(
outbitcnt
<=
BITS_IN_BUF
);
assert
(
s
->
i_bit_out
>
0
);
assert
(
s
->
i_bit_out
<=
BITS_IN_BUF
);
}
static
inline
void
Refill_bits
(
void
)
static
inline
void
bs_refill
(
bs_transrate_t
*
s
)
{
assert
((
rbuf
-
cbuf
)
>=
1
);
inbitbuf
|=
cbuf
[
0
]
<<
(
24
-
inbitcnt
);
inbitcnt
+=
8
;
SEEKR
(
1
)
assert
((
s
->
p_r
-
s
->
p_c
)
>=
1
);
s
->
i_bit_in_cache
|=
s
->
p_c
[
0
]
<<
(
24
-
s
->
i_bit_in
);
s
->
i_bit_in
+=
8
;
s
->
p_c
++
;
}
static
inline
void
Flush_Bits
(
uint
n
)
static
inline
void
bs_flush
(
bs_transrate_t
*
s
,
unsigned
int
n
)
{
assert
(
inbitcnt
>=
n
);
assert
(
s
->
i_bit_in
>=
n
);
inbitbuf
<<=
n
;
inbitcnt
-=
n
;
s
->
i_bit_in_cache
<<=
n
;
s
->
i_bit_in
-=
n
;
assert
(
(
!
n
)
||
((
n
>
0
)
&&
!
(
inbitbuf
&
0x1
))
);
assert
(
(
!
n
)
||
((
n
>
0
)
&&
!
(
s
->
i_bit_in_cache
&
0x1
))
);
while
(
unlikely
(
inbitcnt
<
24
))
Refill_bits
(
);
while
(
unlikely
(
s
->
i_bit_in
<
24
))
bs_refill
(
s
);
}
static
inline
u
int
Show_Bits
(
u
int
n
)
static
inline
u
nsigned
int
bs_read
(
bs_transrate_t
*
s
,
unsigned
int
n
)
{
return
((
unsigned
int
)
inbitbuf
)
>>
(
32
-
n
);
unsigned
int
Val
=
((
unsigned
int
)
s
->
i_bit_in_cache
)
>>
(
32
-
n
);
bs_flush
(
s
,
n
);
return
Val
;
}
static
inline
u
int
Get_Bits
(
u
int
n
)
static
inline
u
nsigned
int
bs_copy
(
bs_transrate_t
*
s
,
unsigned
int
n
)
{
uint
Val
=
Show_Bits
(
n
);
Flush_Bits
(
n
);
return
Val
;
unsigned
int
Val
=
bs_read
(
s
,
n
);
bs_write
(
s
,
Val
,
n
);
return
Val
;
}
static
inline
uint
Copy_Bits
(
uint
n
)
static
inline
void
bs_flush_read
(
bs_transrate_t
*
s
)
{
uint
Val
=
Get_Bits
(
n
);
putbits
(
Val
,
n
);
return
Val
;
}
static
inline
void
flush_read_buffer
()
{
int
i
=
inbitcnt
&
0x7
;
if
(
i
)
{
//uint val = Show_Bits(i);
//putbits(val, i);
assert
(((
unsigned
int
)
inbitbuf
)
>>
(
32
-
i
)
==
0
);
inbitbuf
<<=
i
;
inbitcnt
-=
i
;
}
SEEKR
(
-
1
*
(
inbitcnt
>>
3
));
inbitcnt
=
0
;
int
i
=
s
->
i_bit_in
&
0x7
;
if
(
i
)
{
assert
(((
unsigned
int
)
bs
->
i_bit_in_cache
)
>>
(
32
-
i
)
==
0
);
s
->
i_bit_in_cache
<<=
i
;
s
->
i_bit_in
-=
i
;
}
s
->
p_c
+=
-
1
*
(
s
->
i_bit_in
>>
3
);
s
->
i_bit_in
=
0
;
}
static
inline
void
flush_write_buffer
()
static
inline
void
bs_flush_write
(
bs_transrate_t
*
s
)
{
if
(
outbitcnt
!=
8
)
putbits
(
0
,
outbitcn
t
);
if
(
s
->
i_bit_out
!=
8
)
bs_write
(
s
,
0
,
s
->
i_bit_ou
t
);
}
/////---- begin ext mpeg code
const
uint8
non_linear_mquant_table
[
32
]
=
const
uint8
_t
non_linear_mquant_table
[
32
]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
24
,
28
,
32
,
36
,
40
,
44
,
48
,
52
,
56
,
64
,
72
,
80
,
88
,
96
,
104
,
112
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
24
,
28
,
32
,
36
,
40
,
44
,
48
,
52
,
56
,
64
,
72
,
80
,
88
,
96
,
104
,
112
};
const
uint8
map_non_linear_mquant
[
113
]
=
const
uint8
_t
map_non_linear_mquant
[
113
]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
8
,
9
,
9
,
10
,
10
,
11
,
11
,
12
,
12
,
13
,
13
,
14
,
14
,
15
,
15
,
16
,
16
,
16
,
17
,
17
,
17
,
18
,
18
,
18
,
18
,
19
,
19
,
19
,
19
,
20
,
20
,
20
,
20
,
21
,
21
,
21
,
21
,
22
,
22
,
22
,
22
,
23
,
23
,
23
,
23
,
24
,
24
,
24
,
24
,
24
,
24
,
24
,
25
,
25
,
25
,
25
,
25
,
25
,
25
,
26
,
26
,
26
,
26
,
26
,
26
,
26
,
26
,
27
,
27
,
27
,
27
,
27
,
27
,
27
,
27
,
28
,
28
,
28
,
28
,
28
,
28
,
28
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
30
,
30
,
30
,
30
,
30
,
30
,
30
,
31
,
31
,
31
,
31
,
31
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
8
,
9
,
9
,
10
,
10
,
11
,
11
,
12
,
12
,
13
,
13
,
14
,
14
,
15
,
15
,
16
,
16
,
16
,
17
,
17
,
17
,
18
,
18
,
18
,
18
,
19
,
19
,
19
,
19
,
20
,
20
,
20
,
20
,
21
,
21
,
21
,
21
,
22
,
22
,
22
,
22
,
23
,
23
,
23
,
23
,
24
,
24
,
24
,
24
,
24
,
24
,
24
,
25
,
25
,
25
,
25
,
25
,
25
,
25
,
26
,
26
,
26
,
26
,
26
,
26
,
26
,
26
,
27
,
27
,
27
,
27
,
27
,
27
,
27
,
27
,
28
,
28
,
28
,
28
,
28
,
28
,
28
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
29
,
30
,
30
,
30
,
30
,
30
,
30
,
30
,
31
,
31
,
31
,
31
,
31
};
static
int
scale_quant
(
double
quant
)
static
int
scale_quant
(
unsigned
int
q_scale_type
,
double
quant
)
{
int
iquant
;
if
(
q_scale_type
)
{
iquant
=
(
int
)
floor
(
quant
+
0
.
5
);
/* clip mquant to legal (linear) range */
if
(
iquant
<
1
)
iquant
=
1
;
if
(
iquant
>
112
)
iquant
=
112
;
iquant
=
non_linear_mquant_table
[
map_non_linear_mquant
[
iquant
]];
}
else
{
/* clip mquant to legal (linear) range */
iquant
=
(
int
)
floor
(
quant
+
0
.
5
);
if
(
iquant
<
2
)
iquant
=
2
;
if
(
iquant
>
62
)
iquant
=
62
;
iquant
=
(
iquant
/
2
)
*
2
;
// Must be *even*
}
return
iquant
;
int
iquant
;
if
(
q_scale_type
)
{
iquant
=
(
int
)
floor
(
quant
+
0
.
5
);
/* clip mquant to legal (linear) range */
if
(
iquant
<
1
)
iquant
=
1
;
if
(
iquant
>
112
)
iquant
=
112
;
iquant
=
non_linear_mquant_table
[
map_non_linear_mquant
[
iquant
]];
}
else
{
/* clip mquant to legal (linear) range */
iquant
=
(
int
)
floor
(
quant
+
0
.
5
);
if
(
iquant
<
2
)
iquant
=
2
;
if
(
iquant
>
62
)
iquant
=
62
;
iquant
=
(
iquant
/
2
)
*
2
;
// Must be *even*
}
return
iquant
;
}
static
int
increment_quant
(
int
quant
)
static
int
increment_quant
(
transrate_t
*
tr
,
int
quant
)
{
if
(
q_scale_type
)
{
assert
(
quant
>=
1
&&
quant
<=
112
);
quant
=
map_non_linear_mquant
[
quant
]
+
1
;
if
(
quant_corr
<
-
60
.
0
f
)
quant
++
;
if
(
quant
>
31
)
quant
=
31
;
quant
=
non_linear_mquant_table
[
quant
];
}
else
{
assert
(
!
(
quant
&
1
));
quant
+=
2
;
if
(
quant_corr
<
-
60
.
0
f
)
quant
+=
2
;
if
(
quant
>
62
)
quant
=
62
;
}
return
quant
;
if
(
tr
->
q_scale_type
)
{
assert
(
quant
>=
1
&&
quant
<=
112
);
quant
=
map_non_linear_mquant
[
quant
]
+
1
;
if
(
tr
->
quant_corr
<
-
60
.
0
f
)
quant
++
;
if
(
quant
>
31
)
quant
=
31
;
quant
=
non_linear_mquant_table
[
quant
];
}
else
{
assert
(
!
(
quant
&
1
));
quant
+=
2
;
if
(
tr
->
quant_corr
<
-
60
.
0
f
)
quant
+=
2
;
if
(
quant
>
62
)
quant
=
62
;
}
return
quant
;
}
static
inline
int
intmax
(
register
int
x
,
register
int
y
)
{
return
x
<
y
?
y
:
x
;
}
{
return
x
<
y
?
y
:
x
;
}
static
inline
int
intmin
(
register
int
x
,
register
int
y
)
{
return
x
<
y
?
x
:
y
;
}
{
return
x
<
y
?
x
:
y
;
}
static
int
getNewQuant
(
int
curQuant
)
static
int
getNewQuant
(
transrate_t
*
tr
,
int
curQuant
)
{
double
calc_quant
,
quant_to_use
;
int
mquant
=
0
;
quant_corr
=
(((
inbytecnt
-
(
rbuf
-
4
-
cbuf
))
/
fact_x
)
-
(
outbytecnt
+
(
wbuf
-
owbuf
)))
/
REACT_DELAY
;
calc_quant
=
curQuant
*
fact_x
;
quant_to_use
=
calc_quant
-
quant_corr
;
switch
(
picture_coding_type
)
{
case
I_TYPE
:
case
P_TYPE
:
mquant
=
increment_quant
(
curQuant
);
break
;
case
B_TYPE
:
mquant
=
intmax
(
scale_quant
(
quant_to_use
),
increment_quant
(
curQuant
));
break
;
default:
assert
(
0
);
break
;
}
/*
LOGF("type: %s orig_quant: %3i calc_quant: %7.1f quant_corr: %7.1f using_quant: %3i\n",
(picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
(int)curQuant, (float)calc_quant, (float)quant_corr, (int)mquant);
*/
assert
(
mquant
>=
curQuant
);
return
mquant
;
bs_transrate_t
*
bs
=
&
tr
->
bs
;
double
calc_quant
,
quant_to_use
;
int
mquant
=
0
;
tr
->
quant_corr
=
(((
bs
->
i_byte_in
-
(
bs
->
p_r
-
4
-
bs
->
p_c
))
/
tr
->
fact_x
)
-
(
bs
->
i_byte_out
+
(
bs
->
p_w
-
bs
->
p_ow
)))
/
REACT_DELAY
;
calc_quant
=
curQuant
*
tr
->
fact_x
;
quant_to_use
=
calc_quant
-
tr
->
quant_corr
;
switch
(
tr
->
picture_coding_type
)
{
case
I_TYPE
:
case
P_TYPE
:
mquant
=
increment_quant
(
tr
,
curQuant
);
break
;
case
B_TYPE
:
mquant
=
intmax
(
scale_quant
(
tr
->
q_scale_type
,
quant_to_use
),
increment_quant
(
tr
,
curQuant
));
break
;
default:
assert
(
0
);
break
;
}
/*
LOGF("type: %s orig_quant: %3i calc_quant: %7.1f quant_corr: %7.1f using_quant: %3i\n",
(picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
(int)curQuant, (float)calc_quant, (float)quant_corr, (int)mquant);
*/
assert
(
mquant
>=
curQuant
);
return
mquant
;
}
static
inline
int
isNotEmpty
(
RunLevel
*
blk
)
{
return
(
blk
->
level
);
return
(
blk
->
level
);
}
#include "putvlc.h"
void
putAC
(
int
run
,
int
signed_level
,
int
vlcformat
)
static
void
putAC
(
bs_transrate_t
*
bs
,
int
run
,
int
signed_level
,
int
vlcformat
)
{
int
level
,
len
;
const
VLCtable
*
ptab
=
NULL
;
level
=
(
signed_level
<
0
)
?
-
signed_level
:
signed_level
;
/* abs(signed_level) */
assert
(
!
(
run
<
0
||
run
>
63
||
level
==
0
||
level
>
2047
));
len
=
0
;
if
(
run
<
2
&&
level
<
41
)
{
if
(
vlcformat
)
ptab
=
&
dct_code_tab1a
[
run
][
level
-
1
];
else
ptab
=
&
dct_code_tab1
[
run
][
level
-
1
];
len
=
ptab
->
len
;
}
else
if
(
run
<
32
&&
level
<
6
)
{
if
(
vlcformat
)
ptab
=
&
dct_code_tab2a
[
run
-
2
][
level
-
1
];
else
ptab
=
&
dct_code_tab2
[
run
-
2
][
level
-
1
];
len
=
ptab
->
len
;
}
if
(
len
)
/* a VLC code exists */
{
putbits
(
ptab
->
code
,
len
);
putbits
(
signed_level
<
0
,
1
);
/* sign */
}
else
{
putbits
(
1l
,
6
);
/* Escape */
putbits
(
run
,
6
);
/* 6 bit code for run */
putbits
(((
uint
)
signed_level
)
&
0xFFF
,
12
);
}
}
int
level
,
len
;
const
VLCtable
*
ptab
=
NULL
;
level
=
(
signed_level
<
0
)
?
-
signed_level
:
signed_level
;
/* abs(signed_level) */
static
inline
void
putACfirst
(
int
run
,
int
val
)
{
if
(
run
==
0
&&
(
val
==
1
||
val
==-
1
))
putbits
(
2
|
(
val
<
0
),
2
);
else
putAC
(
run
,
val
,
0
);
}
assert
(
!
(
run
<
0
||
run
>
63
||
level
==
0
||
level
>
2047
));
void
putnonintrablk
(
RunLevel
*
blk
)
{
assert
(
blk
->
level
);
putACfirst
(
blk
->
run
,
blk
->
level
);
blk
++
;
while
(
blk
->
level
)
{
putAC
(
blk
->
run
,
blk
->
level
,
0
);
blk
++
;
}
putbits
(
2
,
2
);
len
=
0
;
if
(
run
<
2
&&
level
<
41
)
{
if
(
vlcformat
)
ptab
=
&
dct_code_tab1a
[
run
][
level
-
1
];
else
ptab
=
&
dct_code_tab1
[
run
][
level
-
1
];
len
=
ptab
->
len
;
}
else
if
(
run
<
32
&&
level
<
6
)
{
if
(
vlcformat
)
ptab
=
&
dct_code_tab2a
[
run
-
2
][
level
-
1
];
else
ptab
=
&
dct_code_tab2
[
run
-
2
][
level
-
1
];
len
=
ptab
->
len
;
}
if
(
len
)
/* a VLC code exists */
{
bs_write
(
bs
,
ptab
->
code
,
len
);
bs_write
(
bs
,
signed_level
<
0
,
1
);
/* sign */
}
else
{
bs_write
(
bs
,
1l
,
6
);
/* Escape */
bs_write
(
bs
,
run
,
6
);
/* 6 bit code for run */
bs_write
(
bs
,
((
unsigned
int
)
signed_level
)
&
0xFFF
,
12
);
}
}
static
inline
void
putcbp
(
int
cbp
)
static
inline
void
putACfirst
(
bs_transrate_t
*
bs
,
int
run
,
int
val
)
{
putbits
(
cbptable
[
cbp
].
code
,
cbptable
[
cbp
].
len
);
if
(
run
==
0
&&
(
val
==
1
||
val
==-
1
))
bs_write
(
bs
,
2
|
(
val
<
0
),
2
);
else
putAC
(
bs
,
run
,
val
,
0
);
}
void
putmbtype
(
int
mb_type
)
static
void
putnonintrablk
(
bs_transrate_t
*
bs
,
RunLevel
*
blk
)
{
putbits
(
mbtypetab
[
picture_coding_type
-
1
][
mb_type
].
code
,
mbtypetab
[
picture_coding_type
-
1
][
mb_type
].
len
);
assert
(
blk
->
level
);
putACfirst
(
bs
,
blk
->
run
,
blk
->
level
);
blk
++
;
while
(
blk
->
level
)
{
putAC
(
bs
,
blk
->
run
,
blk
->
level
,
0
);
blk
++
;
}
bs_write
(
bs
,
2
,
2
);
}
#include <inttypes.h>
#include "getvlc.h"
static
int
non_linear_quantizer_scale
[]
=
static
const
int
non_linear_quantizer_scale
[]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
...
...
@@ -650,1222 +610,1263 @@ static int non_linear_quantizer_scale [] =
56
,
64
,
72
,
80
,
88
,
96
,
104
,
112
};
static
inline
int
get_macroblock_modes
(
)
static
inline
int
get_macroblock_modes
(
transrate_t
*
tr
)
{
bs_transrate_t
*
bs
=
&
tr
->
bs
;
int
macroblock_modes
;
const
MBtab
*
tab
;
switch
(
picture_coding_type
)
{
case
I_TYPE
:
tab
=
MB_I
+
UBITS
(
bit_buf
,
1
);
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
macroblock_modes
=
tab
->
modes
;
if
((
!
(
frame_pred_frame_dct
))
&&
(
picture_structure
==
FRAME_PICTURE
))
{
macroblock_modes
|=
UBITS
(
bit_buf
,
1
)
*
DCT_TYPE_INTERLACED
;
DUMPBITS
(
bit_buf
,
bits
,
1
);
}
return
macroblock_modes
;
case
P_TYPE
:
tab
=
MB_P
+
UBITS
(
bit_buf
,
5
);
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
macroblock_modes
=
tab
->
modes
;
if
(
picture_structure
!=
FRAME_PICTURE
)
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
{
macroblock_modes
|=
UBITS
(
bit_buf
,
2
)
*
MOTION_TYPE_BASE
;
DUMPBITS
(
bit_buf
,
bits
,
2
);
}
return
macroblock_modes
;
}
else
if
(
frame_pred_frame_dct
)
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
macroblock_modes
|=
MC_FRAME
;
return
macroblock_modes
;
}
else
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
{
macroblock_modes
|=
UBITS
(
bit_buf
,
2
)
*
MOTION_TYPE_BASE
;
DUMPBITS
(
bit_buf
,
bits
,
2
);
}
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
{
macroblock_modes
|=
UBITS
(
bit_buf
,
1
)
*
DCT_TYPE_INTERLACED
;
DUMPBITS
(
bit_buf
,
bits
,
1
);
}
return
macroblock_modes
;
}
case
B_TYPE
:
tab
=
MB_B
+
UBITS
(
bit_buf
,
6
);
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
macroblock_modes
=
tab
->
modes
;
if
(
picture_structure
!=
FRAME_PICTURE
)
{
if
(
!
(
macroblock_modes
&
MACROBLOCK_INTRA
))
{
macroblock_modes
|=
UBITS
(
bit_buf
,
2
)
*
MOTION_TYPE_BASE
;
DUMPBITS
(
bit_buf
,
bits
,
2
);
}
return
macroblock_modes
;
}
else
if
(
frame_pred_frame_dct
)
{
/* if (! (macroblock_modes & MACROBLOCK_INTRA)) */
macroblock_modes
|=
MC_FRAME
;
return
macroblock_modes
;
}
else
{
if
(
macroblock_modes
&
MACROBLOCK_INTRA
)
goto
intra
;
macroblock_modes
|=
UBITS
(
bit_buf
,
2
)
*
MOTION_TYPE_BASE
;
DUMPBITS
(
bit_buf
,
bits
,
2
);
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
{
intra:
macroblock_modes
|=
UBITS
(
bit_buf
,
1
)
*
DCT_TYPE_INTERLACED
;
DUMPBITS
(
bit_buf
,
bits
,
1
);
}
return
macroblock_modes
;
}
default:
return
0
;
switch
(
tr
->
picture_coding_type
)
{
case
I_TYPE
:
tab
=
MB_I
+
UBITS
(
bs
->
i_bit_in_cache
,
1
);
bs_flush
(
bs
,
tab
->
len
);
macroblock_modes
=
tab
->
modes
;
if
((
!
(
tr
->
frame_pred_frame_dct
))
&&
(
tr
->
picture_structure
==
FRAME_PICTURE
))
{
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
1
)
*
DCT_TYPE_INTERLACED
;
bs_flush
(
bs
,
1
);
}
return
macroblock_modes
;
case
P_TYPE
:
tab
=
MB_P
+
UBITS
(
bs
->
i_bit_in_cache
,
5
);
bs_flush
(
bs
,
tab
->
len
);
macroblock_modes
=
tab
->
modes
;
if
(
tr
->
picture_structure
!=
FRAME_PICTURE
)
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
{
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
2
)
*
MOTION_TYPE_BASE
;
bs_flush
(
bs
,
2
);
}
return
macroblock_modes
;
}
else
if
(
tr
->
frame_pred_frame_dct
)
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
macroblock_modes
|=
MC_FRAME
;
return
macroblock_modes
;
}
else
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
{
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
2
)
*
MOTION_TYPE_BASE
;
bs_flush
(
bs
,
2
);
}
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
{
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
1
)
*
DCT_TYPE_INTERLACED
;
bs_flush
(
bs
,
1
);
}
return
macroblock_modes
;
}
case
B_TYPE
:
tab
=
MB_B
+
UBITS
(
bs
->
i_bit_in_cache
,
6
);
bs_flush
(
bs
,
tab
->
len
);
macroblock_modes
=
tab
->
modes
;
if
(
tr
->
picture_structure
!=
FRAME_PICTURE
)
{
if
(
!
(
macroblock_modes
&
MACROBLOCK_INTRA
))
{
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
2
)
*
MOTION_TYPE_BASE
;
bs_flush
(
bs
,
2
);
}
return
macroblock_modes
;
}
else
if
(
tr
->
frame_pred_frame_dct
)
{
/* if (! (macroblock_modes & MACROBLOCK_INTRA)) */
macroblock_modes
|=
MC_FRAME
;
return
macroblock_modes
;
}
else
{
if
(
macroblock_modes
&
MACROBLOCK_INTRA
)
goto
intra
;
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
2
)
*
MOTION_TYPE_BASE
;
bs_flush
(
bs
,
2
);
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
{
intra:
macroblock_modes
|=
UBITS
(
bs
->
i_bit_in_cache
,
1
)
*
DCT_TYPE_INTERLACED
;
bs_flush
(
bs
,
1
);
}
return
macroblock_modes
;
}
default:
return
0
;
}
}
static
inline
int
get_quantizer_scale
(
)
static
inline
int
get_quantizer_scale
(
transrate_t
*
tr
)
{
bs_transrate_t
*
bs
=
&
tr
->
bs
;
int
quantizer_scale_code
;
quantizer_scale_code
=
UBITS
(
bit_buf
,
5
);
DUMPBITS
(
bit_buf
,
bits
,
5
);
if
(
q_scale_type
)
return
non_linear_quantizer_scale
[
quantizer_scale_code
];
else
return
quantizer_scale_code
<<
1
;
quantizer_scale_code
=
UBITS
(
bs
->
i_bit_in_cache
,
5
);
bs_flush
(
bs
,
5
);
if
(
tr
->
q_scale_type
)
return
non_linear_quantizer_scale
[
quantizer_scale_code
];
else
return
quantizer_scale_code
<<
1
;
}
static
inline
int
get_motion_delta
(
const
int
f_code
)
static
inline
int
get_motion_delta
(
bs_transrate_t
*
bs
,
const
int
f_code
)
{
#define bit_buf (inbitbuf)
int
delta
;
int
sign
;
const
MVtab
*
tab
;
if
(
b
it_buf
&
0x80000000
)
{
COPYBITS
(
bit_buf
,
bits
,
1
);
return
0
;
if
(
b
s
->
i_bit_in_cache
&
0x80000000
)
{
bs_copy
(
bs
,
1
);
return
0
;
}
else
if
(
bit_buf
>=
0x0c000000
)
{
tab
=
MV_4
+
UBITS
(
bit_buf
,
4
);
delta
=
(
tab
->
delta
<<
f_code
)
+
1
;
COPYBITS
(
bit_buf
,
bit
s
,
tab
->
len
);
sign
=
SBITS
(
bit_buf
,
1
);
COPYBITS
(
bit_buf
,
bits
,
1
);
if
(
f_code
)
delta
+=
UBITS
(
bit_buf
,
f_code
);
COPYBITS
(
bit_buf
,
bit
s
,
f_code
);
return
(
delta
^
sign
)
-
sign
;
else
if
(
bs
->
i_bit_in_cache
>=
0x0c000000
)
{
tab
=
MV_4
+
UBITS
(
bs
->
i_bit_in_cache
,
4
);
delta
=
(
tab
->
delta
<<
f_code
)
+
1
;
bs_copy
(
b
s
,
tab
->
len
);
sign
=
SBITS
(
bs
->
i_bit_in_cache
,
1
);
bs_copy
(
bs
,
1
);
if
(
f_code
)
delta
+=
UBITS
(
bs
->
i_bit_in_cache
,
f_code
);
bs_copy
(
b
s
,
f_code
);
return
(
delta
^
sign
)
-
sign
;
}
else
{
tab
=
MV_10
+
UBITS
(
bit_buf
,
10
);
delta
=
(
tab
->
delta
<<
f_code
)
+
1
;
COPYBITS
(
bit_buf
,
bit
s
,
tab
->
len
);
sign
=
SBITS
(
bit_buf
,
1
);
COPYBITS
(
bit_buf
,
bit
s
,
1
);
if
(
f_code
)
{
delta
+=
UBITS
(
bit_buf
,
f_code
);
COPYBITS
(
bit_buf
,
bit
s
,
f_code
);
}
return
(
delta
^
sign
)
-
sign
;
else
{
tab
=
MV_10
+
UBITS
(
bs
->
i_bit_in_cache
,
10
);
delta
=
(
tab
->
delta
<<
f_code
)
+
1
;
bs_copy
(
b
s
,
tab
->
len
);
sign
=
SBITS
(
bs
->
i_bit_in_cache
,
1
);
bs_copy
(
b
s
,
1
);
if
(
f_code
)
{
delta
+=
UBITS
(
bs
->
i_bit_in_cache
,
f_code
);
bs_copy
(
b
s
,
f_code
);
}
return
(
delta
^
sign
)
-
sign
;
}
}
static
inline
int
get_dmv
(
)
static
inline
int
get_dmv
(
bs_transrate_t
*
bs
)
{
const
DMVtab
*
tab
;
tab
=
DMV_2
+
UBITS
(
b
it_buf
,
2
);
COPYBITS
(
bit_buf
,
bit
s
,
tab
->
len
);
tab
=
DMV_2
+
UBITS
(
b
s
->
i_bit_in_cache
,
2
);
bs_copy
(
b
s
,
tab
->
len
);
return
tab
->
dmv
;
}
static
inline
int
get_coded_block_pattern
(
)
static
inline
int
get_coded_block_pattern
(
bs_transrate_t
*
bs
)
{
#define bit_buf (inbitbuf)
const
CBPtab
*
tab
;
if
(
b
it_buf
>=
0x20000000
)
{
tab
=
CBP_7
+
(
UBITS
(
bit_buf
,
7
)
-
16
);
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
return
tab
->
cbp
;
if
(
b
s
->
i_bit_in_cache
>=
0x20000000
)
{
tab
=
CBP_7
+
(
UBITS
(
bs
->
i_bit_in_cache
,
7
)
-
16
);
bs_flush
(
bs
,
tab
->
len
);
return
tab
->
cbp
;
}
else
{
tab
=
CBP_9
+
UBITS
(
bit_buf
,
9
);
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
return
tab
->
cbp
;
else
{
tab
=
CBP_9
+
UBITS
(
bs
->
i_bit_in_cache
,
9
);
bs_flush
(
bs
,
tab
->
len
);
return
tab
->
cbp
;
}
}
static
inline
int
get_luma_dc_dct_diff
(
)
static
inline
int
get_luma_dc_dct_diff
(
bs_transrate_t
*
bs
)
{
#define bit_buf (inbitbuf)
const
DCtab
*
tab
;
int
size
;
int
dc_diff
;
if
(
bit_buf
<
0xf8000000
)
{
tab
=
DC_lum_5
+
UBITS
(
bit_buf
,
5
);
size
=
tab
->
size
;
if
(
size
)
{
COPYBITS
(
bit_buf
,
bits
,
tab
->
len
);
//dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
dc_diff
=
UBITS
(
bit_buf
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
COPYBITS
(
bit_buf
,
bits
,
size
);
return
dc_diff
;
}
else
{
COPYBITS
(
bit_buf
,
bits
,
3
);
return
0
;
}
if
(
bs
->
i_bit_in_cache
<
0xf8000000
)
{
tab
=
DC_lum_5
+
UBITS
(
bs
->
i_bit_in_cache
,
5
);
size
=
tab
->
size
;
if
(
size
)
{
bs_copy
(
bs
,
tab
->
len
);
//dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
dc_diff
=
UBITS
(
bs
->
i_bit_in_cache
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
bs_copy
(
bs
,
size
);
return
dc_diff
;
}
else
{
bs_copy
(
bs
,
3
);
return
0
;
}
}
else
{
tab
=
DC_long
+
(
UBITS
(
bit_buf
,
9
)
-
0x1e0
);
size
=
tab
->
size
;
COPYBITS
(
bit_buf
,
bits
,
tab
->
len
);
//dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
dc_diff
=
UBITS
(
bit_buf
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
COPYBITS
(
bit_buf
,
bits
,
size
);
return
dc_diff
;
else
{
tab
=
DC_long
+
(
UBITS
(
bs
->
i_bit_in_cache
,
9
)
-
0x1e0
);
size
=
tab
->
size
;
bs_copy
(
bs
,
tab
->
len
);
//dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
dc_diff
=
UBITS
(
bs
->
i_bit_in_cache
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
bs_copy
(
bs
,
size
);
return
dc_diff
;
}
}
static
inline
int
get_chroma_dc_dct_diff
(
)
static
inline
int
get_chroma_dc_dct_diff
(
bs_transrate_t
*
bs
)
{
#define bit_buf (inbitbuf)
const
DCtab
*
tab
;
int
size
;
int
dc_diff
;
if
(
bit_buf
<
0xf8000000
)
{
tab
=
DC_chrom_5
+
UBITS
(
bit_buf
,
5
);
size
=
tab
->
size
;
if
(
size
)
{
COPYBITS
(
bit_buf
,
bits
,
tab
->
len
);
//dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
dc_diff
=
UBITS
(
bit_buf
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
COPYBITS
(
bit_buf
,
bits
,
size
);
return
dc_diff
;
}
else
{
COPYBITS
(
bit_buf
,
bits
,
2
);
return
0
;
}
if
(
bs
->
i_bit_in_cache
<
0xf8000000
)
{
tab
=
DC_chrom_5
+
UBITS
(
bs
->
i_bit_in_cache
,
5
);
size
=
tab
->
size
;
if
(
size
)
{
bs_copy
(
bs
,
tab
->
len
);
//dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
dc_diff
=
UBITS
(
bs
->
i_bit_in_cache
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
bs_copy
(
bs
,
size
);
return
dc_diff
;
}
else
{
bs_copy
(
bs
,
2
);
return
0
;
}
}
else
{
tab
=
DC_long
+
(
UBITS
(
bit_buf
,
10
)
-
0x3e0
);
size
=
tab
->
size
;
COPYBITS
(
bit_buf
,
bits
,
tab
->
len
+
1
);
//dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
dc_diff
=
UBITS
(
bit_buf
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
COPYBITS
(
bit_buf
,
bits
,
size
);
return
dc_diff
;
else
{
tab
=
DC_long
+
(
UBITS
(
bs
->
i_bit_in_cache
,
10
)
-
0x3e0
);
size
=
tab
->
size
;
bs_copy
(
bs
,
tab
->
len
+
1
);
//dc_diff = UBITS (bs->i_bit_in_cache, size) - UBITS (SBITS (~bs->i_bit_in_cache, 1), size);
dc_diff
=
UBITS
(
bs
->
i_bit_in_cache
,
size
);
if
(
!
(
dc_diff
>>
(
size
-
1
)))
dc_diff
=
(
dc_diff
+
1
)
-
(
1
<<
size
);
bs_copy
(
bs
,
size
);
return
dc_diff
;
}
}
static
void
get_intra_block_B14
(
)
static
void
get_intra_block_B14
(
bs_transrate_t
*
bs
,
const
int
i_qscale
,
const
int
i_qscale_new
)
{
#define bit_buf (inbitbuf)
int
q
=
quantizer_scale
,
nq
=
new_quantizer_scale
,
tst
;
int
tst
;
int
i
,
li
;
int
val
;
const
DCTtab
*
tab
;
/* Basic sanity check --Meuuh */
if
(
q
==
0
)
if
(
i_qscale
==
0
)
{
return
;
}
tst
=
(
nq
/
q
)
+
((
nq
%
q
)
?
1
:
0
);
tst
=
i_qscale_new
/
i_qscale
+
((
i_qscale_new
%
i_qscale
)
?
1
:
0
);
li
=
i
=
0
;
while
(
1
)
{
if
(
bit_buf
>=
0x28000000
)
{
tab
=
DCT_B14AC_5
+
(
UBITS
(
bit_buf
,
5
)
-
5
);
i
+=
tab
->
run
;
if
(
i
>=
64
)
break
;
/* end of block */
normal_code:
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
val
=
tab
->
level
;
if
(
val
>=
tst
)
{
val
=
(
val
^
SBITS
(
bit_buf
,
1
))
-
SBITS
(
bit_buf
,
1
);
putAC
(
i
-
li
-
1
,
(
val
*
q
)
/
nq
,
0
);
li
=
i
;
}
DUMPBITS
(
bit_buf
,
bits
,
1
);
continue
;
}
else
if
(
bit_buf
>=
0x04000000
)
{
tab
=
DCT_B14_8
+
(
UBITS
(
bit_buf
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
/* escape code */
i
+=
(
UBITS
(
bit_buf
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check needed to avoid buffer overflow */
DUMPBITS
(
bit_buf
,
bits
,
12
);
val
=
SBITS
(
bit_buf
,
12
);
if
(
abs
(
val
)
>=
tst
)
{
putAC
(
i
-
li
-
1
,
(
val
*
q
)
/
nq
,
0
);
li
=
i
;
}
DUMPBITS
(
bit_buf
,
bits
,
12
);
continue
;
}
else
if
(
bit_buf
>=
0x02000000
)
{
tab
=
DCT_B14_10
+
(
UBITS
(
bit_buf
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bit_buf
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bit_buf
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bit_buf
,
16
);
DUMPBITS
(
bit_buf
,
bits
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
COPYBITS
(
bit_buf
,
bits
,
2
);
/* end of block code */
for
(
;;
)
{
if
(
bs
->
i_bit_in_cache
>=
0x28000000
)
{
tab
=
DCT_B14AC_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
5
)
-
5
);
i
+=
tab
->
run
;
if
(
i
>=
64
)
break
;
/* end of block */
normal_code:
bs_flush
(
bs
,
tab
->
len
);
val
=
tab
->
level
;
if
(
val
>=
tst
)
{
val
=
(
val
^
SBITS
(
bs
->
i_bit_in_cache
,
1
))
-
SBITS
(
bs
->
i_bit_in_cache
,
1
);
putAC
(
bs
,
i
-
li
-
1
,
(
val
*
i_qscale
)
/
i_qscale_new
,
0
);
li
=
i
;
}
bs_flush
(
bs
,
1
);
continue
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x04000000
)
{
tab
=
DCT_B14_8
+
(
UBITS
(
bs
->
i_bit_in_cache
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
/* escape code */
i
+=
(
UBITS
(
bs
->
i_bit_in_cache
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check needed to avoid buffer overflow */
bs_flush
(
bs
,
12
);
val
=
SBITS
(
bs
->
i_bit_in_cache
,
12
);
if
(
abs
(
val
)
>=
tst
)
{
putAC
(
bs
,
i
-
li
-
1
,
(
val
*
i_qscale
)
/
i_qscale_new
,
0
);
li
=
i
;
}
bs_flush
(
bs
,
12
);
continue
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x02000000
)
{
tab
=
DCT_B14_10
+
(
UBITS
(
bs
->
i_bit_in_cache
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bs
->
i_bit_in_cache
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bs
->
i_bit_in_cache
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bs
->
i_bit_in_cache
,
16
);
bs_flush
(
bs
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
bs_copy
(
bs
,
2
);
/* end of block code */
}
static
void
get_intra_block_B15
(
)
static
void
get_intra_block_B15
(
bs_transrate_t
*
bs
,
const
int
i_qscale
,
int
const
i_qscale_new
)
{
#define bit_buf (inbitbuf)
int
q
=
quantizer_scale
,
nq
=
new_quantizer_scale
,
tst
;
int
tst
;
int
i
,
li
;
int
val
;
const
DCTtab
*
tab
;
/* Basic sanity check --Meuuh */
if
(
q
==
0
)
if
(
i_qscale
==
0
)
{
return
;
}
tst
=
(
nq
/
q
)
+
((
nq
%
q
)
?
1
:
0
);
tst
=
i_qscale_new
/
i_qscale
+
((
i_qscale_new
%
i_qscale
)
?
1
:
0
);
li
=
i
=
0
;
while
(
1
)
{
if
(
bit_buf
>=
0x04000000
)
{
tab
=
DCT_B15_8
+
(
UBITS
(
bit_buf
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
{
normal_code:
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
val
=
tab
->
level
;
if
(
val
>=
tst
)
{
val
=
(
val
^
SBITS
(
bit_buf
,
1
))
-
SBITS
(
bit_buf
,
1
);
putAC
(
i
-
li
-
1
,
(
val
*
q
)
/
nq
,
1
);
li
=
i
;
}
DUMPBITS
(
bit_buf
,
bits
,
1
);
continue
;
}
else
{
i
+=
(
UBITS
(
bit_buf
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check against buffer overflow */
DUMPBITS
(
bit_buf
,
bits
,
12
);
val
=
SBITS
(
bit_buf
,
12
);
if
(
abs
(
val
)
>=
tst
)
{
putAC
(
i
-
li
-
1
,
(
val
*
q
)
/
nq
,
1
);
li
=
i
;
}
DUMPBITS
(
bit_buf
,
bits
,
12
);
continue
;
}
}
else
if
(
bit_buf
>=
0x02000000
)
{
tab
=
DCT_B15_10
+
(
UBITS
(
bit_buf
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bit_buf
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bit_buf
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bit_buf
,
16
);
DUMPBITS
(
bit_buf
,
bits
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
COPYBITS
(
bit_buf
,
bits
,
4
);
/* end of block code */
for
(
;;
)
{
if
(
bs
->
i_bit_in_cache
>=
0x04000000
)
{
tab
=
DCT_B15_8
+
(
UBITS
(
bs
->
i_bit_in_cache
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
{
normal_code:
bs_flush
(
bs
,
tab
->
len
);
val
=
tab
->
level
;
if
(
val
>=
tst
)
{
val
=
(
val
^
SBITS
(
bs
->
i_bit_in_cache
,
1
))
-
SBITS
(
bs
->
i_bit_in_cache
,
1
);
putAC
(
bs
,
i
-
li
-
1
,
(
val
*
i_qscale
)
/
i_qscale_new
,
1
);
li
=
i
;
}
bs_flush
(
bs
,
1
);
continue
;
}
else
{
i
+=
(
UBITS
(
bs
->
i_bit_in_cache
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check against buffer overflow */
bs_flush
(
bs
,
12
);
val
=
SBITS
(
bs
->
i_bit_in_cache
,
12
);
if
(
abs
(
val
)
>=
tst
)
{
putAC
(
bs
,
i
-
li
-
1
,
(
val
*
i_qscale
)
/
i_qscale_new
,
1
);
li
=
i
;
}
bs_flush
(
bs
,
12
);
continue
;
}
}
else
if
(
bs
->
i_bit_in_cache
>=
0x02000000
)
{
tab
=
DCT_B15_10
+
(
UBITS
(
bs
->
i_bit_in_cache
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bs
->
i_bit_in_cache
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bs
->
i_bit_in_cache
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bs
->
i_bit_in_cache
,
16
);
bs_flush
(
bs
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
bs_copy
(
bs
,
4
);
/* end of block code */
}
static
int
get_non_intra_block_drop
(
RunLevel
*
blk
)
static
int
get_non_intra_block_drop
(
transrate_t
*
tr
,
RunLevel
*
blk
)
{
#define bit_buf (inbitbuf)
bs_transrate_t
*
bs
=
&
tr
->
bs
;
int
i
,
li
;
int
val
;
const
DCTtab
*
tab
;
RunLevel
*
sblk
=
blk
+
1
;
RunLevel
*
sblk
=
blk
+
1
;
li
=
i
=
-
1
;
if
(
b
it_buf
>=
0x28000000
)
{
tab
=
DCT_B14DC_5
+
(
UBITS
(
bit_buf
,
5
)
-
5
);
goto
entry_1
;
if
(
b
s
->
i_bit_in_cache
>=
0x28000000
)
{
tab
=
DCT_B14DC_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
5
)
-
5
);
goto
entry_1
;
}
else
goto
entry_2
;
while
(
1
)
{
if
(
bit_buf
>=
0x28000000
)
{
tab
=
DCT_B14AC_5
+
(
UBITS
(
bit_buf
,
5
)
-
5
);
entry_1:
i
+=
tab
->
run
;
if
(
i
>=
64
)
break
;
/* end of block */
normal_code:
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
val
=
tab
->
level
;
val
=
(
val
^
SBITS
(
bit_buf
,
1
))
-
SBITS
(
bit_buf
,
1
);
/* if (bitstream_get (1)) val = -val; */
blk
->
level
=
val
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
DUMPBITS
(
bit_buf
,
bits
,
1
);
continue
;
}
entry_2:
if
(
bit_buf
>=
0x04000000
)
{
tab
=
DCT_B14_8
+
(
UBITS
(
bit_buf
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
/* escape code */
i
+=
(
UBITS
(
bit_buf
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check needed to avoid buffer overflow */
DUMPBITS
(
bit_buf
,
bits
,
12
);
val
=
SBITS
(
bit_buf
,
12
);
blk
->
level
=
val
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
DUMPBITS
(
bit_buf
,
bits
,
12
);
continue
;
}
else
if
(
bit_buf
>=
0x02000000
)
{
tab
=
DCT_B14_10
+
(
UBITS
(
bit_buf
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bit_buf
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bit_buf
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bit_buf
,
16
);
DUMPBITS
(
bit_buf
,
bits
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
DUMPBITS
(
bit_buf
,
bits
,
2
);
/* dump end of block code */
// remove last coeff
if
(
blk
!=
sblk
)
{
blk
--
;
// remove more coeffs if very late
if
((
quant_corr
<
-
60
.
0
f
)
&&
(
blk
!=
sblk
))
{
blk
--
;
if
((
quant_corr
<
-
80
.
0
f
)
&&
(
blk
!=
sblk
))
{
blk
--
;
if
((
quant_corr
<
-
100
.
0
f
)
&&
(
blk
!=
sblk
))
{
blk
--
;
if
((
quant_corr
<
-
120
.
0
f
)
&&
(
blk
!=
sblk
))
blk
--
;
}
}
}
}
blk
->
level
=
0
;
else
goto
entry_2
;
for
(
;;
)
{
if
(
bs
->
i_bit_in_cache
>=
0x28000000
)
{
tab
=
DCT_B14AC_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
5
)
-
5
);
entry_1:
i
+=
tab
->
run
;
if
(
i
>=
64
)
break
;
/* end of block */
normal_code:
bs_flush
(
bs
,
tab
->
len
);
val
=
tab
->
level
;
val
=
(
val
^
SBITS
(
bs
->
i_bit_in_cache
,
1
))
-
SBITS
(
bs
->
i_bit_in_cache
,
1
);
/* if (bitstream_get (1)) val = -val; */
blk
->
level
=
val
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
bs_flush
(
bs
,
1
);
continue
;
}
entry_2:
if
(
bs
->
i_bit_in_cache
>=
0x04000000
)
{
tab
=
DCT_B14_8
+
(
UBITS
(
bs
->
i_bit_in_cache
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
/* escape code */
i
+=
(
UBITS
(
bs
->
i_bit_in_cache
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check needed to avoid buffer overflow */
bs_flush
(
bs
,
12
);
val
=
SBITS
(
bs
->
i_bit_in_cache
,
12
);
blk
->
level
=
val
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
bs_flush
(
bs
,
12
);
continue
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x02000000
)
{
tab
=
DCT_B14_10
+
(
UBITS
(
bs
->
i_bit_in_cache
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bs
->
i_bit_in_cache
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bs
->
i_bit_in_cache
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bs
->
i_bit_in_cache
,
16
);
bs_flush
(
bs
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
bs_flush
(
bs
,
2
);
/* dump end of block code */
// remove last coeff
if
(
blk
!=
sblk
)
{
blk
--
;
// remove more coeffs if very late
if
((
tr
->
quant_corr
<
-
60
.
0
f
)
&&
(
blk
!=
sblk
))
{
blk
--
;
if
((
tr
->
quant_corr
<
-
80
.
0
f
)
&&
(
blk
!=
sblk
))
{
blk
--
;
if
((
tr
->
quant_corr
<
-
100
.
0
f
)
&&
(
blk
!=
sblk
))
{
blk
--
;
if
((
tr
->
quant_corr
<
-
120
.
0
f
)
&&
(
blk
!=
sblk
))
blk
--
;
}
}
}
}
blk
->
level
=
0
;
return
i
;
}
static
int
get_non_intra_block_rq
(
RunLevel
*
blk
)
static
int
get_non_intra_block_rq
(
bs_transrate_t
*
bs
,
RunLevel
*
blk
,
const
int
i_qscale
,
const
int
i_qscale_new
)
{
#define bit_buf (inbitbuf)
int
q
=
quantizer_scale
,
nq
=
new_quantizer_scale
,
tst
;
int
tst
;
int
i
,
li
;
int
val
;
const
DCTtab
*
tab
;
/* Basic sanity check --Meuuh */
if
(
q
==
0
)
if
(
i_qscale
==
0
)
{
return
0
;
}
tst
=
(
nq
/
q
)
+
((
nq
%
q
)
?
1
:
0
);
tst
=
i_qscale_new
/
i_qscale
+
((
i_qscale_new
%
i_qscale
)
?
1
:
0
);
li
=
i
=
-
1
;
if
(
b
it_buf
>=
0x28000000
)
{
tab
=
DCT_B14DC_5
+
(
UBITS
(
bit_buf
,
5
)
-
5
);
goto
entry_1
;
if
(
b
s
->
i_bit_in_cache
>=
0x28000000
)
{
tab
=
DCT_B14DC_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
5
)
-
5
);
goto
entry_1
;
}
else
goto
entry_2
;
while
(
1
)
{
if
(
bit_buf
>=
0x28000000
)
{
tab
=
DCT_B14AC_5
+
(
UBITS
(
bit_buf
,
5
)
-
5
);
entry_1:
i
+=
tab
->
run
;
if
(
i
>=
64
)
break
;
/* end of block */
normal_code:
DUMPBITS
(
bit_buf
,
bits
,
tab
->
len
);
val
=
tab
->
level
;
if
(
val
>=
tst
)
{
val
=
(
val
^
SBITS
(
bit_buf
,
1
))
-
SBITS
(
bit_buf
,
1
);
blk
->
level
=
(
val
*
q
)
/
nq
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
}
//if ( ((val) && (tab->level < tst)) || ((!val) && (tab->level >= tst)) )
// LOGF("level: %i val: %i tst : %i q: %i nq : %i\n", tab->level, val, tst, q, nq);
DUMPBITS
(
bit_buf
,
bits
,
1
);
continue
;
}
entry_2:
if
(
bit_buf
>=
0x04000000
)
{
tab
=
DCT_B14_8
+
(
UBITS
(
bit_buf
,
8
)
-
4
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
/* escape code */
i
+=
(
UBITS
(
bit_buf
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check needed to avoid buffer overflow */
DUMPBITS
(
bit_buf
,
bits
,
12
);
val
=
SBITS
(
bit_buf
,
12
);
if
(
abs
(
val
)
>=
tst
)
{
blk
->
level
=
(
val
*
q
)
/
nq
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
}
DUMPBITS
(
bit_buf
,
bits
,
12
);
continue
;
}
else
if
(
bit_buf
>=
0x02000000
)
{
tab
=
DCT_B14_10
+
(
UBITS
(
bit_buf
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bit_buf
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bit_buf
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bit_buf
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bit_buf
,
16
);
DUMPBITS
(
bit_buf
,
bits
,
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
DUMPBITS
(
bit_buf
,
bits
,
2
);
/* dump end of block code */
blk
->
level
=
0
;
else
goto
entry_2
;
return
i
;
}
for
(
;;
)
{
if
(
bs
->
i_bit_in_cache
>=
0x28000000
)
{
tab
=
DCT_B14AC_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
5
)
-
5
);
static
inline
void
slice_intra_DCT
(
const
int
cc
)
{
if
(
cc
==
0
)
get_luma_dc_dct_diff
();
else
get_chroma_dc_dct_diff
();
entry_1:
i
+=
tab
->
run
;
if
(
i
>=
64
)
break
;
/* end of block */
if
(
intra_vlc_format
)
get_intra_block_B15
();
else
get_intra_block_B14
();
}
normal_code:
static
inline
void
slice_non_intra_DCT
(
int
cur_block
)
{
if
(
picture_coding_type
==
P_TYPE
)
get_non_intra_block_drop
(
block
[
cur_block
]);
else
get_non_intra_block_rq
(
block
[
cur_block
]);
}
bs_flush
(
bs
,
tab
->
len
);
val
=
tab
->
level
;
if
(
val
>=
tst
)
{
val
=
(
val
^
SBITS
(
bs
->
i_bit_in_cache
,
1
))
-
SBITS
(
bs
->
i_bit_in_cache
,
1
);
blk
->
level
=
(
val
*
i_qscale
)
/
i_qscale_new
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
}
static
void
motion_fr_frame
(
uint
f_code
[
2
]
)
{
get_motion_delta
(
f_code
[
0
]);
get_motion_delta
(
f_code
[
1
]);
}
//if ( ((val) && (tab->level < tst)) || ((!val) && (tab->level >= tst)) )
// LOGF("level: %i val: %i tst : %i q: %i nq : %i\n", tab->level, val, tst, q, nq);
static
void
motion_fr_field
(
uint
f_code
[
2
]
)
{
COPYBITS
(
bit_buf
,
bits
,
1
);
bs_flush
(
bs
,
1
);
continue
;
}
get_motion_delta
(
f_code
[
0
]);
get_motion_delta
(
f_code
[
1
]);
entry_2:
if
(
bs
->
i_bit_in_cache
>=
0x04000000
)
{
tab
=
DCT_B14_8
+
(
UBITS
(
bs
->
i_bit_in_cache
,
8
)
-
4
);
COPYBITS
(
bit_buf
,
bits
,
1
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
get_motion_delta
(
f_code
[
0
]);
get_motion_delta
(
f_code
[
1
]);
}
/* escape code */
static
void
motion_fr_dmv
(
uint
f_code
[
2
]
)
{
get_motion_delta
(
f_code
[
0
]);
get_dmv
();
i
+=
(
UBITS
(
bs
->
i_bit_in_cache
,
12
)
&
0x3F
)
-
64
;
if
(
i
>=
64
)
break
;
/* illegal, check needed to avoid buffer overflow */
bs_flush
(
bs
,
12
);
val
=
SBITS
(
bs
->
i_bit_in_cache
,
12
);
if
(
abs
(
val
)
>=
tst
)
{
blk
->
level
=
(
val
*
i_qscale
)
/
i_qscale_new
;
blk
->
run
=
i
-
li
-
1
;
li
=
i
;
blk
++
;
}
bs_flush
(
bs
,
12
);
continue
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x02000000
)
{
tab
=
DCT_B14_10
+
(
UBITS
(
bs
->
i_bit_in_cache
,
10
)
-
8
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00800000
)
{
tab
=
DCT_13
+
(
UBITS
(
bs
->
i_bit_in_cache
,
13
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x00200000
)
{
tab
=
DCT_15
+
(
UBITS
(
bs
->
i_bit_in_cache
,
15
)
-
16
);
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
else
{
tab
=
DCT_16
+
UBITS
(
bs
->
i_bit_in_cache
,
16
);
bs_flush
(
bs
,
16
);
get_motion_delta
(
f_code
[
1
]);
get_dmv
();
i
+=
tab
->
run
;
if
(
i
<
64
)
goto
normal_code
;
}
break
;
/* illegal, check needed to avoid buffer overflow */
}
bs_flush
(
bs
,
2
);
/* dump end of block code */
blk
->
level
=
0
;
return
i
;
}
/* like motion_frame, but parsing without actual motion compensation */
static
void
motion_fr_conceal
(
)
static
void
motion_fr_frame
(
bs_transrate_t
*
bs
,
unsigned
int
f_code
[
2
]
)
{
get_motion_delta
(
f_code
[
0
][
0
]);
get_motion_delta
(
f_code
[
0
][
1
]);
COPYBITS
(
bit_buf
,
bits
,
1
);
/* remove marker_bit */
get_motion_delta
(
bs
,
f_code
[
0
]
);
get_motion_delta
(
bs
,
f_code
[
1
]
);
}
static
void
motion_f
i_field
(
u
int
f_code
[
2
]
)
static
void
motion_f
r_field
(
bs_transrate_t
*
bs
,
unsigned
int
f_code
[
2
]
)
{
COPYBITS
(
bit_buf
,
bits
,
1
);
bs_copy
(
bs
,
1
);
get_motion_delta
(
bs
,
f_code
[
0
]);
get_motion_delta
(
bs
,
f_code
[
1
]);
bs_copy
(
bs
,
1
);
get_motion_delta
(
f_code
[
0
]);
get_motion_delta
(
f_code
[
1
]);
get_motion_delta
(
bs
,
f_code
[
0
]);
get_motion_delta
(
bs
,
f_code
[
1
]);
}
static
void
motion_f
i_16x8
(
u
int
f_code
[
2
]
)
static
void
motion_f
r_dmv
(
bs_transrate_t
*
bs
,
unsigned
int
f_code
[
2
]
)
{
COPYBITS
(
bit_buf
,
bits
,
1
);
get_motion_delta
(
bs
,
f_code
[
0
]);
get_dmv
(
bs
);
get_motion_delta
(
f_code
[
0
]);
get_motion_delta
(
f_code
[
1
]);
get_motion_delta
(
bs
,
f_code
[
1
]);
get_dmv
(
bs
);
}
COPYBITS
(
bit_buf
,
bits
,
1
);
static
void
motion_fi_field
(
bs_transrate_t
*
bs
,
unsigned
int
f_code
[
2
]
)
{
bs_copy
(
bs
,
1
);
get_motion_delta
(
f_code
[
0
]);
get_motion_delta
(
f_code
[
1
]);
get_motion_delta
(
bs
,
f_code
[
0
]);
get_motion_delta
(
bs
,
f_code
[
1
]);
}
static
void
motion_fi_
dmv
(
u
int
f_code
[
2
]
)
static
void
motion_fi_
16x8
(
bs_transrate_t
*
bs
,
unsigned
int
f_code
[
2
]
)
{
get_motion_delta
(
f_code
[
0
]);
get_dmv
();
bs_copy
(
bs
,
1
);
get_motion_delta
(
bs
,
f_code
[
0
]);
get_motion_delta
(
bs
,
f_code
[
1
]);
bs_copy
(
bs
,
1
);
get_motion_delta
(
f_code
[
1
]);
get_dmv
(
);
get_motion_delta
(
bs
,
f_code
[
0
]);
get_motion_delta
(
bs
,
f_code
[
1
]
);
}
static
void
motion_fi_
conceal
(
)
static
void
motion_fi_
dmv
(
bs_transrate_t
*
bs
,
unsigned
int
f_code
[
2
]
)
{
COPYBITS
(
bit_buf
,
bits
,
1
);
/* remove field_select */
get_motion_delta
(
bs
,
f_code
[
0
]);
get_dmv
(
bs
);
get_motion_delta
(
f_code
[
0
][
0
]);
get_motion_delta
(
f_code
[
0
][
1
]);
COPYBITS
(
bit_buf
,
bits
,
1
);
/* remove marker_bit */
get_motion_delta
(
bs
,
f_code
[
1
]);
get_dmv
(
bs
);
}
#define MOTION_CALL(routine,direction) \
do { \
if ((direction) & MACROBLOCK_MOTION_FORWARD) \
routine (f_code[0]); \
if ((direction) & MACROBLOCK_MOTION_BACKWARD) \
routine (f_code[1]); \
#define MOTION_CALL(routine,direction) \
do { \
if ((direction) & MACROBLOCK_MOTION_FORWARD) \
routine( bs, tr->f_code[0]); \
if ((direction) & MACROBLOCK_MOTION_BACKWARD) \
routine( bs, tr->f_code[1]); \
} while (0)
#define NEXT_MACROBLOCK
\
do {
\
h_offset += 16;
\
if
(h_offset == horizontal_size_value)
\
{
\
v_offset += 16;
\
if (v_offset > (vertical_size_value - 16)) return;
\
h_offset = 0;
\
}
\
#define NEXT_MACROBLOCK
\
do {
\
tr->h_offset += 16;
\
if
( tr->h_offset == tr->horizontal_size_value)
\
{
\
tr->v_offset += 16;
\
if (tr->v_offset > (tr->vertical_size_value - 16)) return;
\
tr->h_offset = 0;
\
}
\
} while (0)
void
putmbdata
(
int
macroblock_modes
)
static
void
putmbdata
(
transrate_t
*
tr
,
int
macroblock_modes
)
{
putmbtype
(
macroblock_modes
&
0x1F
);
switch
(
picture_coding_type
)
{
case
I_TYPE
:
if
((
!
(
frame_pred_frame_dct
))
&&
(
picture_structure
==
FRAME_PICTURE
))
putbits
(
macroblock_modes
&
DCT_TYPE_INTERLACED
?
1
:
0
,
1
);
break
;
case
P_TYPE
:
if
(
picture_structure
!=
FRAME_PICTURE
)
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
putbits
((
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
break
;
}
else
if
(
frame_pred_frame_dct
)
break
;
else
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
putbits
((
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
putbits
(
macroblock_modes
&
DCT_TYPE_INTERLACED
?
1
:
0
,
1
);
break
;
}
case
B_TYPE
:
if
(
picture_structure
!=
FRAME_PICTURE
)
{
if
(
!
(
macroblock_modes
&
MACROBLOCK_INTRA
))
putbits
((
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
break
;
}
else
if
(
frame_pred_frame_dct
)
break
;
else
{
if
(
macroblock_modes
&
MACROBLOCK_INTRA
)
goto
intra
;
putbits
((
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
{
intra:
putbits
(
macroblock_modes
&
DCT_TYPE_INTERLACED
?
1
:
0
,
1
);
}
break
;
}
}
bs_transrate_t
*
bs
=
&
tr
->
bs
;
bs_write
(
bs
,
mbtypetab
[
tr
->
picture_coding_type
-
1
][
macroblock_modes
&
0x1F
].
code
,
mbtypetab
[
tr
->
picture_coding_type
-
1
][
macroblock_modes
&
0x1F
].
len
);
switch
(
tr
->
picture_coding_type
)
{
case
I_TYPE
:
if
((
!
(
tr
->
frame_pred_frame_dct
))
&&
(
tr
->
picture_structure
==
FRAME_PICTURE
))
bs_write
(
bs
,
macroblock_modes
&
DCT_TYPE_INTERLACED
?
1
:
0
,
1
);
break
;
case
P_TYPE
:
if
(
tr
->
picture_structure
!=
FRAME_PICTURE
)
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
bs_write
(
bs
,
(
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
break
;
}
else
if
(
tr
->
frame_pred_frame_dct
)
break
;
else
{
if
(
macroblock_modes
&
MACROBLOCK_MOTION_FORWARD
)
bs_write
(
bs
,
(
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
bs_write
(
bs
,
macroblock_modes
&
DCT_TYPE_INTERLACED
?
1
:
0
,
1
);
break
;
}
case
B_TYPE
:
if
(
tr
->
picture_structure
!=
FRAME_PICTURE
)
{
if
(
!
(
macroblock_modes
&
MACROBLOCK_INTRA
))
bs_write
(
bs
,
(
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
break
;
}
else
if
(
tr
->
frame_pred_frame_dct
)
break
;
else
{
if
(
macroblock_modes
&
MACROBLOCK_INTRA
)
goto
intra
;
bs_write
(
bs
,
(
macroblock_modes
&
MOTION_TYPE_MASK
)
/
MOTION_TYPE_BASE
,
2
);
if
(
macroblock_modes
&
(
MACROBLOCK_INTRA
|
MACROBLOCK_PATTERN
))
{
intra:
bs_write
(
bs
,
macroblock_modes
&
DCT_TYPE_INTERLACED
?
1
:
0
,
1
);
}
break
;
}
}
}
static
inline
void
put_quantiser
(
int
quantiser
)
static
inline
void
put_quantiser
(
transrate_t
*
tr
)
{
putbits
(
q_scale_type
?
map_non_linear_mquant
[
quantiser
]
:
quantiser
>>
1
,
5
);
last_coded_scale
=
quantiser
;
bs_transrate_t
*
bs
=
&
tr
->
bs
;
bs_write
(
bs
,
tr
->
q_scale_type
?
map_non_linear_mquant
[
tr
->
new_quantizer_scale
]
:
tr
->
new_quantizer_scale
>>
1
,
5
);
tr
->
last_coded_scale
=
tr
->
new_quantizer_scale
;
}
static
int
slice_init
(
int
code
)
static
int
slice_init
(
transrate_t
*
tr
,
int
code
)
{
#define bit_buf (inbitbuf)
bs_transrate_t
*
bs
=
&
tr
->
bs
;
int
offset
;
const
MBAtab
*
mba
;
v_offset
=
(
code
-
1
)
*
16
;
tr
->
v_offset
=
(
code
-
1
)
*
16
;
quantizer_scale
=
get_quantizer_scale
();
if
(
picture_coding_type
==
P_TYPE
)
new_quantizer_scale
=
quantizer_scale
;
else
new_quantizer_scale
=
getNewQuant
(
quantizer_scale
);
put_quantiser
(
new_quantizer_scale
);
/*LOGF("************************\nstart of slice %i in %s picture. ori quant: %i new quant: %i\n", code,
(picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
quantizer_scale, new_quantizer_scale);*/
tr
->
quantizer_scale
=
get_quantizer_scale
(
tr
);
if
(
tr
->
picture_coding_type
==
P_TYPE
)
{
tr
->
new_quantizer_scale
=
tr
->
quantizer_scale
;
}
else
{
tr
->
new_quantizer_scale
=
getNewQuant
(
tr
,
tr
->
quantizer_scale
);
}
put_quantiser
(
tr
);
/*LOGF("************************\nstart of slice %i in %s picture. ori quant: %i new quant: %i\n", code,
(picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
quantizer_scale, new_quantizer_scale);*/
/* ignore intra_slice and all the extra data */
while
(
b
it_buf
&
0x80000000
)
{
DUMPBITS
(
bit_buf
,
bits
,
9
);
while
(
b
s
->
i_bit_in_cache
&
0x80000000
)
{
bs_flush
(
bs
,
9
);
}
/* decode initial macroblock address increment */
offset
=
0
;
while
(
1
)
{
if
(
bit_buf
>=
0x08000000
)
{
mba
=
MBA_5
+
(
UBITS
(
bit_buf
,
6
)
-
2
);
break
;
}
else
if
(
bit_buf
>=
0x01800000
)
{
mba
=
MBA_11
+
(
UBITS
(
bit_buf
,
12
)
-
24
);
break
;
}
else
switch
(
UBITS
(
bit_buf
,
12
))
{
case
8
:
/* macroblock_escape */
offset
+=
33
;
COPYBITS
(
bit_buf
,
bits
,
11
);
continue
;
default:
/* error */
return
1
;
}
for
(
;;
)
{
if
(
bs
->
i_bit_in_cache
>=
0x08000000
)
{
mba
=
MBA_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
6
)
-
2
);
break
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x01800000
)
{
mba
=
MBA_11
+
(
UBITS
(
bs
->
i_bit_in_cache
,
12
)
-
24
);
break
;
}
else
if
(
UBITS
(
bs
->
i_bit_in_cache
,
12
)
==
8
)
{
/* macroblock_escape */
offset
+=
33
;
bs_copy
(
bs
,
11
);
}
else
{
return
-
1
;
}
}
COPYBITS
(
bit_buf
,
bit
s
,
mba
->
len
+
1
);
h_offset
=
(
offset
+
mba
->
mba
)
<<
4
;
bs_copy
(
b
s
,
mba
->
len
+
1
);
tr
->
h_offset
=
(
offset
+
mba
->
mba
)
<<
4
;
while
(
h_offset
-
(
int
)
horizontal_size_value
>=
0
)
{
h_offset
-=
horizontal_size_value
;
v_offset
+=
16
;
while
(
tr
->
h_offset
-
(
int
)
tr
->
horizontal_size_value
>=
0
)
{
tr
->
h_offset
-=
tr
->
horizontal_size_value
;
tr
->
v_offset
+=
16
;
}
if
(
v_offset
>
(
vertical_size_value
-
16
))
return
1
;
if
(
tr
->
v_offset
>
tr
->
vertical_size_value
-
16
)
{
return
-
1
;
}
return
0
;
}
void
mpeg2_slice
(
const
int
code
)
static
void
mpeg2_slice
(
transrate_t
*
tr
,
const
int
code
)
{
#define bit_buf (inbitbuf)
if
(
slice_init
(
code
))
return
;
while
(
1
)
{
int
macroblock_modes
;
int
mba_inc
;
const
MBAtab
*
mba
;
macroblock_modes
=
get_macroblock_modes
();
if
(
macroblock_modes
&
MACROBLOCK_QUANT
)
quantizer_scale
=
get_quantizer_scale
();
//LOGF("blk %i : ", h_offset >> 4);
if
(
macroblock_modes
&
MACROBLOCK_INTRA
)
{
//LOG("intra "); if (macroblock_modes & MACROBLOCK_QUANT) LOGF("got new quant: %i ", quantizer_scale);
new_quantizer_scale
=
increment_quant
(
quantizer_scale
);
if
(
last_coded_scale
==
new_quantizer_scale
)
macroblock_modes
&=
0xFFFFFFEF
;
// remove MACROBLOCK_QUANT
else
macroblock_modes
|=
MACROBLOCK_QUANT
;
//add MACROBLOCK_QUANT
putmbdata
(
macroblock_modes
);
if
(
macroblock_modes
&
MACROBLOCK_QUANT
)
put_quantiser
(
new_quantizer_scale
);
//if (macroblock_modes & MACROBLOCK_QUANT) LOGF("put new quant: %i ", new_quantizer_scale);
if
(
concealment_motion_vectors
)
{
if
(
picture_structure
==
FRAME_PICTURE
)
motion_fr_conceal
();
else
motion_fi_conceal
();
}
slice_intra_DCT
(
0
);
slice_intra_DCT
(
0
);
slice_intra_DCT
(
0
);
slice_intra_DCT
(
0
);
slice_intra_DCT
(
1
);
slice_intra_DCT
(
2
);
}
else
{
int
new_coded_block_pattern
=
0
;
// begin saving data
int
batb
;
uint8
n_owbuf
[
32
],
*
n_wbuf
,
*
o_owbuf
=
owbuf
,
*
o_wbuf
=
wbuf
;
uint32
n_outbitcnt
,
n_outbitbuf
,
o_outbitcnt
=
outbitcnt
,
o_outbitbuf
=
outbitbuf
;
outbitbuf
=
0
;
outbitcnt
=
BITS_IN_BUF
;
owbuf
=
wbuf
=
n_owbuf
;
if
(
picture_structure
==
FRAME_PICTURE
)
switch
(
macroblock_modes
&
MOTION_TYPE_MASK
)
{
case
MC_FRAME
:
MOTION_CALL
(
motion_fr_frame
,
macroblock_modes
);
break
;
case
MC_FIELD
:
MOTION_CALL
(
motion_fr_field
,
macroblock_modes
);
break
;
case
MC_DMV
:
MOTION_CALL
(
motion_fr_dmv
,
MACROBLOCK_MOTION_FORWARD
);
break
;
}
else
switch
(
macroblock_modes
&
MOTION_TYPE_MASK
)
{
case
MC_FIELD
:
MOTION_CALL
(
motion_fi_field
,
macroblock_modes
);
break
;
case
MC_16X8
:
MOTION_CALL
(
motion_fi_16x8
,
macroblock_modes
);
break
;
case
MC_DMV
:
MOTION_CALL
(
motion_fi_dmv
,
MACROBLOCK_MOTION_FORWARD
);
break
;
}
assert
(
wbuf
-
owbuf
<
32
);
n_wbuf
=
wbuf
;
n_outbitcnt
=
outbitcnt
;
n_outbitbuf
=
outbitbuf
;
assert
(
owbuf
==
n_owbuf
);
outbitcnt
=
o_outbitcnt
;
outbitbuf
=
o_outbitbuf
;
owbuf
=
o_owbuf
;
wbuf
=
o_wbuf
;
// end saving data
if
(
picture_coding_type
==
P_TYPE
)
new_quantizer_scale
=
quantizer_scale
;
else
new_quantizer_scale
=
getNewQuant
(
quantizer_scale
);
//LOG("non intra "); if (macroblock_modes & MACROBLOCK_QUANT) LOGF("got new quant: %i ", quantizer_scale);
if
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
{
int
coded_block_pattern
=
get_coded_block_pattern
();
if
(
coded_block_pattern
&
0x20
)
slice_non_intra_DCT
(
0
);
if
(
coded_block_pattern
&
0x10
)
slice_non_intra_DCT
(
1
);
if
(
coded_block_pattern
&
0x08
)
slice_non_intra_DCT
(
2
);
if
(
coded_block_pattern
&
0x04
)
slice_non_intra_DCT
(
3
);
if
(
coded_block_pattern
&
0x02
)
slice_non_intra_DCT
(
4
);
if
(
coded_block_pattern
&
0x01
)
slice_non_intra_DCT
(
5
);
if
(
picture_coding_type
==
B_TYPE
)
{
if
(
coded_block_pattern
&
0x20
)
if
(
isNotEmpty
(
block
[
0
]))
new_coded_block_pattern
|=
0x20
;
if
(
coded_block_pattern
&
0x10
)
if
(
isNotEmpty
(
block
[
1
]))
new_coded_block_pattern
|=
0x10
;
if
(
coded_block_pattern
&
0x08
)
if
(
isNotEmpty
(
block
[
2
]))
new_coded_block_pattern
|=
0x08
;
if
(
coded_block_pattern
&
0x04
)
if
(
isNotEmpty
(
block
[
3
]))
new_coded_block_pattern
|=
0x04
;
if
(
coded_block_pattern
&
0x02
)
if
(
isNotEmpty
(
block
[
4
]))
new_coded_block_pattern
|=
0x02
;
if
(
coded_block_pattern
&
0x01
)
if
(
isNotEmpty
(
block
[
5
]))
new_coded_block_pattern
|=
0x01
;
if
(
!
new_coded_block_pattern
)
macroblock_modes
&=
0xFFFFFFED
;
// remove MACROBLOCK_PATTERN and MACROBLOCK_QUANT flag
}
else
new_coded_block_pattern
=
coded_block_pattern
;
}
if
(
last_coded_scale
==
new_quantizer_scale
)
macroblock_modes
&=
0xFFFFFFEF
;
// remove MACROBLOCK_QUANT
else
if
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
macroblock_modes
|=
MACROBLOCK_QUANT
;
//add MACROBLOCK_QUANT
assert
(
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
||
!
(
macroblock_modes
&
MACROBLOCK_QUANT
)
);
putmbdata
(
macroblock_modes
);
if
(
macroblock_modes
&
MACROBLOCK_QUANT
)
put_quantiser
(
new_quantizer_scale
);
//if (macroblock_modes & MACROBLOCK_PATTERN) LOG("coded ");
//if (macroblock_modes & MACROBLOCK_QUANT) LOGF("put new quant: %i ", new_quantizer_scale);
// put saved motion data...
for
(
batb
=
0
;
batb
<
(
n_wbuf
-
n_owbuf
);
batb
++
)
putbits
(
n_owbuf
[
batb
],
8
);
putbits
(
n_outbitbuf
,
BITS_IN_BUF
-
n_outbitcnt
);
// end saved motion data...
if
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
{
putcbp
(
new_coded_block_pattern
);
if
(
new_coded_block_pattern
&
0x20
)
putnonintrablk
(
block
[
0
]);
if
(
new_coded_block_pattern
&
0x10
)
putnonintrablk
(
block
[
1
]);
if
(
new_coded_block_pattern
&
0x08
)
putnonintrablk
(
block
[
2
]);
if
(
new_coded_block_pattern
&
0x04
)
putnonintrablk
(
block
[
3
]);
if
(
new_coded_block_pattern
&
0x02
)
putnonintrablk
(
block
[
4
]);
if
(
new_coded_block_pattern
&
0x01
)
putnonintrablk
(
block
[
5
]);
}
}
//LOGF("\n\to: %i c: %i n: %i\n", quantizer_scale, last_coded_scale, new_quantizer_scale);
NEXT_MACROBLOCK
;
mba_inc
=
0
;
while
(
1
)
{
if
(
bit_buf
>=
0x10000000
)
{
mba
=
MBA_5
+
(
UBITS
(
bit_buf
,
5
)
-
2
);
break
;
}
else
if
(
bit_buf
>=
0x03000000
)
{
mba
=
MBA_11
+
(
UBITS
(
bit_buf
,
11
)
-
24
);
break
;
}
else
switch
(
UBITS
(
bit_buf
,
11
))
{
case
8
:
/* macroblock_escape */
mba_inc
+=
33
;
COPYBITS
(
bit_buf
,
bits
,
11
);
continue
;
default:
/* end of slice, or error */
return
;
}
}
COPYBITS
(
bit_buf
,
bits
,
mba
->
len
);
mba_inc
+=
mba
->
mba
;
if
(
mba_inc
)
do
{
NEXT_MACROBLOCK
;
}
while
(
--
mba_inc
);
bs_transrate_t
*
bs
=
&
tr
->
bs
;
if
(
slice_init
(
tr
,
code
)
)
{
return
;
}
for
(
;;
)
{
int
macroblock_modes
;
int
mba_inc
;
const
MBAtab
*
mba
;
macroblock_modes
=
get_macroblock_modes
(
tr
);
if
(
macroblock_modes
&
MACROBLOCK_QUANT
)
tr
->
quantizer_scale
=
get_quantizer_scale
(
tr
);
//LOGF("blk %i : ", h_offset >> 4);
if
(
macroblock_modes
&
MACROBLOCK_INTRA
)
{
//LOG("intra "); if (macroblock_modes & MACROBLOCK_QUANT) LOGF("got new quant: %i ", quantizer_scale);
tr
->
new_quantizer_scale
=
increment_quant
(
tr
,
tr
->
quantizer_scale
);
if
(
tr
->
last_coded_scale
==
tr
->
new_quantizer_scale
)
macroblock_modes
&=
0xFFFFFFEF
;
// remove MACROBLOCK_QUANT
else
macroblock_modes
|=
MACROBLOCK_QUANT
;
//add MACROBLOCK_QUANT
putmbdata
(
tr
,
macroblock_modes
);
if
(
macroblock_modes
&
MACROBLOCK_QUANT
)
put_quantiser
(
tr
);
//if (macroblock_modes & MACROBLOCK_QUANT) LOGF("put new quant: %i ", new_quantizer_scale);
if
(
tr
->
concealment_motion_vectors
)
{
if
(
tr
->
picture_structure
!=
FRAME_PICTURE
)
{
bs_copy
(
bs
,
1
);
/* remove field_select */
}
/* like motion_frame, but parsing without actual motion compensation */
get_motion_delta
(
bs
,
tr
->
f_code
[
0
][
0
]);
get_motion_delta
(
bs
,
tr
->
f_code
[
0
][
1
]);
bs_copy
(
bs
,
1
);
/* remove marker_bit */
}
if
(
tr
->
intra_vlc_format
)
{
/* Luma */
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B15
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B15
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B15
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B15
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
/* Chroma */
get_chroma_dc_dct_diff
(
bs
);
get_intra_block_B15
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_chroma_dc_dct_diff
(
bs
);
get_intra_block_B15
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
}
else
{
/* Luma */
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B14
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B14
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B14
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_luma_dc_dct_diff
(
bs
);
get_intra_block_B14
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
/* Chroma */
get_chroma_dc_dct_diff
(
bs
);
get_intra_block_B14
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
get_chroma_dc_dct_diff
(
bs
);
get_intra_block_B14
(
bs
,
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
}
}
else
{
RunLevel
block
[
6
][
65
];
// terminated by level = 0, so we need 64+1
int
new_coded_block_pattern
=
0
;
// begin saving data
int
batb
;
uint8_t
p_n_ow
[
32
],
*
p_n_w
,
*
p_o_ow
=
bs
->
p_ow
,
*
p_o_w
=
bs
->
p_w
;
uint32_t
i_n_bit_out
,
i_n_bit_out_cache
,
i_o_bit_out
=
bs
->
i_bit_out
,
i_o_bit_out_cache
=
bs
->
i_bit_out_cache
;
bs
->
i_bit_out_cache
=
0
;
bs
->
i_bit_out
=
BITS_IN_BUF
;
bs
->
p_ow
=
bs
->
p_w
=
p_n_ow
;
if
(
tr
->
picture_structure
==
FRAME_PICTURE
)
switch
(
macroblock_modes
&
MOTION_TYPE_MASK
)
{
case
MC_FRAME
:
MOTION_CALL
(
motion_fr_frame
,
macroblock_modes
);
break
;
case
MC_FIELD
:
MOTION_CALL
(
motion_fr_field
,
macroblock_modes
);
break
;
case
MC_DMV
:
MOTION_CALL
(
motion_fr_dmv
,
MACROBLOCK_MOTION_FORWARD
);
break
;
}
else
switch
(
macroblock_modes
&
MOTION_TYPE_MASK
)
{
case
MC_FIELD
:
MOTION_CALL
(
motion_fi_field
,
macroblock_modes
);
break
;
case
MC_16X8
:
MOTION_CALL
(
motion_fi_16x8
,
macroblock_modes
);
break
;
case
MC_DMV
:
MOTION_CALL
(
motion_fi_dmv
,
MACROBLOCK_MOTION_FORWARD
);
break
;
}
assert
(
bs
->
p_w
-
bs
->
p_ow
<
32
);
p_n_w
=
bs
->
p_w
;
i_n_bit_out
=
bs
->
i_bit_out
;
i_n_bit_out_cache
=
bs
->
i_bit_out_cache
;
assert
(
bs
->
p_ow
==
p_n_ow
);
bs
->
i_bit_out
=
i_o_bit_out
;
bs
->
i_bit_out_cache
=
i_o_bit_out_cache
;
bs
->
p_ow
=
p_o_ow
;
bs
->
p_w
=
p_o_w
;
// end saving data
if
(
tr
->
picture_coding_type
==
P_TYPE
)
tr
->
new_quantizer_scale
=
tr
->
quantizer_scale
;
else
tr
->
new_quantizer_scale
=
getNewQuant
(
tr
,
tr
->
quantizer_scale
);
//LOG("non intra "); if (macroblock_modes & MACROBLOCK_QUANT) LOGF("got new quant: %i ", quantizer_scale);
if
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
{
const
int
cbp
=
get_coded_block_pattern
(
bs
);
if
(
tr
->
picture_coding_type
==
P_TYPE
)
{
if
(
cbp
&
0x20
)
get_non_intra_block_drop
(
tr
,
block
[
0
]
);
if
(
cbp
&
0x10
)
get_non_intra_block_drop
(
tr
,
block
[
1
]
);
if
(
cbp
&
0x08
)
get_non_intra_block_drop
(
tr
,
block
[
2
]
);
if
(
cbp
&
0x04
)
get_non_intra_block_drop
(
tr
,
block
[
3
]
);
if
(
cbp
&
0x02
)
get_non_intra_block_drop
(
tr
,
block
[
4
]
);
if
(
cbp
&
0x01
)
get_non_intra_block_drop
(
tr
,
block
[
5
]
);
new_coded_block_pattern
=
cbp
;
}
else
{
if
(
cbp
&
0x20
)
{
get_non_intra_block_rq
(
bs
,
block
[
0
],
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
if
(
isNotEmpty
(
block
[
0
]
)
)
new_coded_block_pattern
|=
0x20
;
}
if
(
cbp
&
0x10
)
{
get_non_intra_block_rq
(
bs
,
block
[
1
],
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
if
(
isNotEmpty
(
block
[
1
]
)
)
new_coded_block_pattern
|=
0x10
;
}
if
(
cbp
&
0x08
)
{
get_non_intra_block_rq
(
bs
,
block
[
2
],
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
if
(
isNotEmpty
(
block
[
2
]
)
)
new_coded_block_pattern
|=
0x08
;
}
if
(
cbp
&
0x04
)
{
get_non_intra_block_rq
(
bs
,
block
[
3
],
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
if
(
isNotEmpty
(
block
[
3
]
)
)
new_coded_block_pattern
|=
0x04
;
}
if
(
cbp
&
0x02
)
{
get_non_intra_block_rq
(
bs
,
block
[
4
],
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
if
(
isNotEmpty
(
block
[
4
]
)
)
new_coded_block_pattern
|=
0x02
;
}
if
(
cbp
&
0x01
)
{
get_non_intra_block_rq
(
bs
,
block
[
5
],
tr
->
quantizer_scale
,
tr
->
new_quantizer_scale
);
if
(
isNotEmpty
(
block
[
5
]
)
)
new_coded_block_pattern
|=
0x01
;
}
if
(
!
new_coded_block_pattern
)
macroblock_modes
&=
0xFFFFFFED
;
// remove MACROBLOCK_PATTERN and MACROBLOCK_QUANT flag
}
}
if
(
tr
->
last_coded_scale
==
tr
->
new_quantizer_scale
)
macroblock_modes
&=
0xFFFFFFEF
;
// remove MACROBLOCK_QUANT
else
if
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
macroblock_modes
|=
MACROBLOCK_QUANT
;
//add MACROBLOCK_QUANT
assert
(
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
||
!
(
macroblock_modes
&
MACROBLOCK_QUANT
)
);
putmbdata
(
tr
,
macroblock_modes
);
if
(
macroblock_modes
&
MACROBLOCK_QUANT
)
{
put_quantiser
(
tr
);
}
// put saved motion data...
for
(
batb
=
0
;
batb
<
(
p_n_w
-
p_n_ow
);
batb
++
)
{
bs_write
(
bs
,
p_n_ow
[
batb
],
8
);
}
bs_write
(
bs
,
i_n_bit_out_cache
,
BITS_IN_BUF
-
i_n_bit_out
);
// end saved motion data...
if
(
macroblock_modes
&
MACROBLOCK_PATTERN
)
{
/* Write CBP */
bs_write
(
bs
,
cbptable
[
new_coded_block_pattern
].
code
,
cbptable
[
new_coded_block_pattern
].
len
);
if
(
new_coded_block_pattern
&
0x20
)
putnonintrablk
(
bs
,
block
[
0
]);
if
(
new_coded_block_pattern
&
0x10
)
putnonintrablk
(
bs
,
block
[
1
]);
if
(
new_coded_block_pattern
&
0x08
)
putnonintrablk
(
bs
,
block
[
2
]);
if
(
new_coded_block_pattern
&
0x04
)
putnonintrablk
(
bs
,
block
[
3
]);
if
(
new_coded_block_pattern
&
0x02
)
putnonintrablk
(
bs
,
block
[
4
]);
if
(
new_coded_block_pattern
&
0x01
)
putnonintrablk
(
bs
,
block
[
5
]);
}
}
//LOGF("\n\to: %i c: %i n: %i\n", quantizer_scale, last_coded_scale, new_quantizer_scale);
NEXT_MACROBLOCK
;
mba_inc
=
0
;
for
(
;;
)
{
if
(
bs
->
i_bit_in_cache
>=
0x10000000
)
{
mba
=
MBA_5
+
(
UBITS
(
bs
->
i_bit_in_cache
,
5
)
-
2
);
break
;
}
else
if
(
bs
->
i_bit_in_cache
>=
0x03000000
)
{
mba
=
MBA_11
+
(
UBITS
(
bs
->
i_bit_in_cache
,
11
)
-
24
);
break
;
}
else
if
(
UBITS
(
bs
->
i_bit_in_cache
,
11
)
==
8
)
{
/* macroblock_escape */
mba_inc
+=
33
;
bs_copy
(
bs
,
11
);
}
else
{
/* EOS or error */
return
;
}
}
bs_copy
(
bs
,
mba
->
len
);
mba_inc
+=
mba
->
mba
;
while
(
mba_inc
--
)
{
NEXT_MACROBLOCK
;
}
}
}
/////---- end ext mpeg code
static
int
do_next_start_code
(
void
)
static
int
do_next_start_code
(
transrate_t
*
tr
)
{
uint8
ID
;
bs_transrate_t
*
bs
=
&
tr
->
bs
;
uint8_t
ID
;
// get start code
LOCK
(
1
)
ID
=
cbuf
[
0
];
COPY
(
1
)
ID
=
bs
->
p_c
[
0
];
/* Copy one byte */
*
bs
->
p_w
++
=
*
bs
->
p_c
++
;
if
(
ID
==
0x00
)
// pic header
{
LOCK
(
4
)
picture_coding_type
=
(
cbuf
[
1
]
>>
3
)
&
0x7
;
cbuf
[
1
]
|=
0x7
;
cbuf
[
2
]
=
0xFF
;
cbuf
[
3
]
|=
0xF8
;
// vbv_delay is now 0xFFFF
COPY
(
4
)
tr
->
picture_coding_type
=
(
bs
->
p_c
[
1
]
>>
3
)
&
0x7
;
bs
->
p_c
[
1
]
|=
0x7
;
bs
->
p_c
[
2
]
=
0xFF
;
bs
->
p_c
[
3
]
|=
0xF8
;
// vbv_delay is now 0xFFFF
memcpy
(
bs
->
p_w
,
bs
->
p_c
,
4
);
bs
->
p_c
+=
4
;
bs
->
p_w
+=
4
;
}
else
if
(
ID
==
0xB3
)
// seq header
{
LOCK
(
8
)
horizontal_size_value
=
(
cbuf
[
0
]
<<
4
)
|
(
cbuf
[
1
]
>>
4
)
;
vertical_size_value
=
((
cbuf
[
1
]
&
0xF
)
<<
8
)
|
cbuf
[
2
];
if
(
!
horizontal_size_value
||
!
vertical_size_value
)
tr
->
horizontal_size_value
=
(
bs
->
p_c
[
0
]
<<
4
)
|
(
bs
->
p_c
[
1
]
>>
4
);
tr
->
vertical_size_value
=
((
bs
->
p_c
[
1
]
&
0xF
)
<<
8
)
|
bs
->
p_c
[
2
]
;
if
(
!
tr
->
horizontal_size_value
||
!
tr
->
vertical_size_value
)
{
return
-
1
;
COPY
(
8
)
}
memcpy
(
bs
->
p_w
,
bs
->
p_c
,
8
);
bs
->
p_c
+=
8
;
bs
->
p_w
+=
8
;
}
else
if
(
ID
==
0xB5
)
// extension
{
LOCK
(
1
)
if
((
cbuf
[
0
]
>>
4
)
==
0x8
)
// pic coding ext
if
((
bs
->
p_c
[
0
]
>>
4
)
==
0x8
)
// pic coding ext
{
LOCK
(
5
)
f_code
[
0
][
0
]
=
(
cbuf
[
0
]
&
0xF
)
-
1
;
f_code
[
0
][
1
]
=
(
cbuf
[
1
]
>>
4
)
-
1
;
f_code
[
1
][
0
]
=
(
cbuf
[
1
]
&
0xF
)
-
1
;
f_code
[
1
][
1
]
=
(
cbuf
[
2
]
>>
4
)
-
1
;
intra_dc_precision
=
(
cbuf
[
2
]
>>
2
)
&
0x3
;
picture_structure
=
cbuf
[
2
]
&
0x3
;
frame_pred_frame_dct
=
(
cbuf
[
3
]
>>
6
)
&
0x1
;
concealment_motion_vectors
=
(
cbuf
[
3
]
>>
5
)
&
0x1
;
q_scale_type
=
(
cbuf
[
3
]
>>
4
)
&
0x1
;
intra_vlc_format
=
(
cbuf
[
3
]
>>
3
)
&
0x1
;
alternate_scan
=
(
cbuf
[
3
]
>>
2
)
&
0x1
;
COPY
(
5
)
tr
->
f_code
[
0
][
0
]
=
(
bs
->
p_c
[
0
]
&
0xF
)
-
1
;
tr
->
f_code
[
0
][
1
]
=
(
bs
->
p_c
[
1
]
>>
4
)
-
1
;
tr
->
f_code
[
1
][
0
]
=
(
bs
->
p_c
[
1
]
&
0xF
)
-
1
;
tr
->
f_code
[
1
][
1
]
=
(
bs
->
p_c
[
2
]
>>
4
)
-
1
;
/* tr->intra_dc_precision = (bs->p_c[2] >> 2) & 0x3; */
tr
->
picture_structure
=
bs
->
p_c
[
2
]
&
0x3
;
tr
->
frame_pred_frame_dct
=
(
bs
->
p_c
[
3
]
>>
6
)
&
0x1
;
tr
->
concealment_motion_vectors
=
(
bs
->
p_c
[
3
]
>>
5
)
&
0x1
;
tr
->
q_scale_type
=
(
bs
->
p_c
[
3
]
>>
4
)
&
0x1
;
tr
->
intra_vlc_format
=
(
bs
->
p_c
[
3
]
>>
3
)
&
0x1
;
/* tr->alternate_scan = (bs->p_c[3] >> 2) & 0x1; */
memcpy
(
bs
->
p_w
,
bs
->
p_c
,
5
);
bs
->
p_c
+=
5
;
bs
->
p_w
+=
5
;
}
else
{
COPY
(
1
)
*
bs
->
p_w
++
=
*
bs
->
p_c
++
;
}
}
else
if
(
ID
==
0xB8
)
// gop header
{
LOCK
(
4
)
COPY
(
4
)
memcpy
(
bs
->
p_w
,
bs
->
p_c
,
4
);
bs
->
p_c
+=
4
;
bs
->
p_w
+=
4
;
}
else
if
((
ID
>=
0x01
)
&&
(
ID
<=
0xAF
))
// slice
{
uint8
*
outTemp
=
wbuf
,
*
inTemp
=
cbuf
;
if
(
((
picture_coding_type
==
B_TYPE
)
&&
(
quant_corr
<
2
.
5
f
))
// don't recompress if we're in advance!
||
((
picture_coding_type
==
P_TYPE
)
&&
(
quant_corr
<
-
2
.
5
f
))
||
((
picture_coding_type
==
I_TYPE
)
&&
(
quant_corr
<
-
5
.
0
f
))
)
{
uint8
*
nsc
=
cbuf
;
int
fsc
=
0
,
toLock
;
if
(
!
horizontal_size_value
||
!
vertical_size_value
)
return
-
1
;
uint8_t
*
outTemp
=
bs
->
p_w
,
*
inTemp
=
bs
->
p_c
;
// lock all the slice
while
(
!
fsc
)
if
(
(
tr
->
picture_coding_type
==
B_TYPE
&&
tr
->
quant_corr
<
2
.
5
f
)
||
// don't recompress if we're in advance!
(
tr
->
picture_coding_type
==
P_TYPE
&&
tr
->
quant_corr
<
-
2
.
5
f
)
||
(
tr
->
picture_coding_type
==
I_TYPE
&&
tr
->
quant_corr
<
-
5
.
0
f
)
)
{
if
(
!
tr
->
horizontal_size_value
||
!
tr
->
vertical_size_value
)
{
toLock
=
nsc
-
cbuf
+
3
;
LOCK
(
toLock
)
if
(
(
nsc
[
0
]
==
0
)
&&
(
nsc
[
1
]
==
0
)
&&
(
nsc
[
2
]
==
1
)
)
fsc
=
1
;
// start code !
else
nsc
++
;
// continue search
return
-
1
;
}
// init bit buffer
inbitbuf
=
0
;
inbitcnt
=
0
;
outbitbuf
=
0
;
outbitcn
t
=
BITS_IN_BUF
;
bs
->
i_bit_in_cache
=
0
;
bs
->
i_bit_in
=
0
;
bs
->
i_bit_out_cache
=
0
;
bs
->
i_bit_ou
t
=
BITS_IN_BUF
;
// get 32 bits
Refill_bits
(
);
Refill_bits
(
);
Refill_bits
(
);
Refill_bits
(
);
bs_refill
(
bs
);
bs_refill
(
bs
);
bs_refill
(
bs
);
bs_refill
(
bs
);
// begin bit level recoding
mpeg2_slice
(
ID
);
flush_read_buffer
();
flush_write_buffer
();
mpeg2_slice
(
tr
,
ID
);
bs_flush_read
(
bs
);
bs_flush_write
(
bs
);
// end bit level recoding
/* Basic sanity checks --Meuuh */
if
(
cbuf
>
rbuf
||
wbuf
>
rwbuf
)
if
(
bs
->
p_c
>
bs
->
p_r
||
bs
->
p_w
>
bs
->
p_rw
)
{
return
-
1
;
}
/*LOGF("type: %s code: %02i in : %6i out : %6i diff : %6i fact: %2.2f\n",
(picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
ID,
cbuf - inTemp, wbuf - outTemp, (wbuf - outTemp) - (cbuf - inTemp), (float)(cbuf - inTemp) / (float)(wbuf
- outTemp));*/
if
(
wbuf
-
outTemp
>
cbuf
-
inTemp
)
// yes that might happen, rarely
ID,
bs->p_c - inTemp, bs->p_w - outTemp, (bs->p_w - outTemp) - (bs->p_c - inTemp), (float)(bs->p_c - inTemp) / (float)(bs->p_w
- outTemp));*/
if
(
bs
->
p_w
-
outTemp
>
bs
->
p_c
-
inTemp
)
// yes that might happen, rarely
{
/*LOGF("*** slice bigger than before !! (type: %s code: %i in : %i out : %i diff : %i)\n",
(picture_coding_type == I_TYPE ? "I_TYPE" : (picture_coding_type == P_TYPE ? "P_TYPE" : "B_TYPE")),
ID,
cbuf - inTemp, wbuf - outTemp, (wbuf - outTemp) - (cbuf
- inTemp));*/
ID,
bs->p_c - inTemp, bs->p_w - outTemp, (bs->p_w - outTemp) - (bs->p_c
- inTemp));*/
// in this case, we'll just use the original slice !
memcpy
(
outTemp
,
inTemp
,
cbuf
-
inTemp
);
wbuf
=
outTemp
+
(
cbuf
-
inTemp
);
// adjust
outbytecn
t
outbytecnt
-=
(
wbuf
-
outTemp
)
-
(
cbuf
-
inTemp
);
memcpy
(
outTemp
,
inTemp
,
bs
->
p_c
-
inTemp
);
bs
->
p_w
=
outTemp
+
(
bs
->
p_c
-
inTemp
);
// adjust
bs->i_byte_ou
t
bs
->
i_byte_out
-=
(
bs
->
p_w
-
outTemp
)
-
(
bs
->
p_c
-
inTemp
);
}
}
}
...
...
@@ -1873,9 +1874,11 @@ static int do_next_start_code(void)
}
static
void
process_frame
(
sout_stream_t
*
p_stream
,
sout_stream_id_t
*
id
,
sout_buffer_t
*
in
,
sout_buffer_t
**
out
)
sout_stream_id_t
*
id
,
sout_buffer_t
*
in
,
sout_buffer_t
**
out
)
{
uint8_t
found
;
transrate_t
*
tr
=
&
id
->
tr
;
bs_transrate_t
*
bs
=
&
tr
->
bs
;
sout_buffer_t
*
p_out
;
/* The output buffer can't be bigger than the input buffer. */
...
...
@@ -1887,52 +1890,76 @@ static void process_frame( sout_stream_t *p_stream,
sout_BufferChain
(
out
,
p_out
);
rwbuf
=
owbuf
=
wbuf
=
p_out
->
p_buffer
;
cbuf
=
rbuf
=
in
->
p_buffer
;
rbuf
+=
in
->
i_size
+
4
;
rwbuf
+=
in
->
i_size
;
bs
->
p_rw
=
bs
->
p_ow
=
bs
->
p_w
=
p_out
->
p_buffer
;
bs
->
p_c
=
bs
->
p_r
=
in
->
p_buffer
;
bs
->
p_r
+=
in
->
i_size
+
4
;
bs
->
p_rw
+=
in
->
i_size
;
*
(
in
->
p_buffer
+
in
->
i_size
)
=
0
;
*
(
in
->
p_buffer
+
in
->
i_size
+
1
)
=
0
;
*
(
in
->
p_buffer
+
in
->
i_size
+
2
)
=
1
;
*
(
in
->
p_buffer
+
in
->
i_size
+
3
)
=
0
;
inbytecnt
+=
in
->
i_size
;
bs
->
i_byte_in
+=
in
->
i_size
;
for
(
;
;
)
{
// get next start code prefix
found
=
0
;
while
(
!
found
)
uint8_t
*
p_end
=
&
in
->
p_buffer
[
in
->
i_size
];
/* Search next start code */
for
(
;;
)
{
#ifndef REMOVE_BYTE_STUFFING
LOCK
(
3
)
#else
LOCK
(
6
)
if
(
(
cbuf
[
0
]
==
0
)
&&
(
cbuf
[
1
]
==
0
)
&&
(
cbuf
[
2
]
==
0
)
&&
(
cbuf
[
3
]
==
0
)
&&
(
cbuf
[
4
]
==
0
)
&&
(
cbuf
[
5
]
==
0
)
)
{
SEEKR
(
1
)
}
else
#endif
if
(
(
cbuf
[
0
]
==
0
)
&&
(
cbuf
[
1
]
==
0
)
&&
(
cbuf
[
2
]
==
1
)
)
found
=
1
;
// start code !
else
{
COPY
(
1
)
}
// continue search
if
(
bs
->
p_c
<
p_end
-
3
&&
bs
->
p_c
[
0
]
==
0
&&
bs
->
p_c
[
1
]
==
0
&&
bs
->
p_c
[
2
]
==
1
)
{
/* Next start code */
break
;
}
else
if
(
bs
->
p_c
<
p_end
-
6
&&
bs
->
p_c
[
0
]
==
0
&&
bs
->
p_c
[
1
]
==
0
&&
bs
->
p_c
[
2
]
==
0
&&
bs
->
p_c
[
3
]
==
0
&&
bs
->
p_c
[
4
]
==
0
&&
bs
->
p_c
[
5
]
==
0
)
{
/* remove stuffing (looking for 6 0x00 bytes) */
bs
->
p_c
++
;
}
else
{
/* Copy */
*
bs
->
p_w
++
=
*
bs
->
p_c
++
;
}
if
(
cbuf
>=
in
->
p_buffer
+
in
->
i_size
)
if
(
bs
->
p_c
>=
p_end
)
{
break
;
}
}
if
(
cbuf
>=
in
->
p_buffer
+
in
->
i_size
)
if
(
bs
->
p_c
>=
p_end
)
{
break
;
COPY
(
3
)
if
(
do_next_start_code
()
==
-
1
)
}
/* Copy the start code */
memcpy
(
bs
->
p_w
,
bs
->
p_c
,
3
);
bs
->
p_c
+=
3
;
bs
->
p_w
+=
3
;
if
(
do_next_start_code
(
tr
)
)
{
/* Error */
break
;
}
quant_corr
=
(((
inbytecnt
-
(
rbuf
-
4
-
cbuf
))
/
fact_x
)
-
(
outbytecnt
+
(
wbuf
-
owbuf
)))
/
REACT_DELAY
;
tr
->
quant_corr
=
(((
bs
->
i_byte_in
-
(
bs
->
p_r
-
4
-
bs
->
p_c
))
/
tr
->
fact_x
)
-
(
bs
->
i_byte_out
+
(
bs
->
p_w
-
bs
->
p_ow
)))
/
REACT_DELAY
;
}
outbytecnt
+=
wbuf
-
owbuf
;
p_out
->
i_size
=
wbuf
-
owbuf
;
bs
->
i_byte_out
+=
bs
->
p_w
-
bs
->
p_ow
;
p_out
->
i_size
=
bs
->
p_w
-
bs
->
p_ow
;
}
static
int
transrate_video_process
(
sout_stream_t
*
p_stream
,
sout_stream_id_t
*
id
,
sout_buffer_t
*
in
,
sout_buffer_t
**
out
)
{
transrate_t
*
tr
=
&
id
->
tr
;
bs_transrate_t
*
bs
=
&
tr
->
bs
;
*
out
=
NULL
;
if
(
in
->
i_flags
&
SOUT_BUFFER_FLAGS_GOP
)
...
...
@@ -1940,9 +1967,9 @@ static int transrate_video_process( sout_stream_t *p_stream,
while
(
id
->
p_current_buffer
!=
NULL
)
{
sout_buffer_t
*
p_next
=
id
->
p_current_buffer
->
p_next
;
if
(
fact_x
==
1
.
0
)
if
(
tr
->
fact_x
==
1
.
0
)
{
outbytecn
t
+=
id
->
p_current_buffer
->
i_size
;
bs
->
i_byte_ou
t
+=
id
->
p_current_buffer
->
i_size
;
id
->
p_current_buffer
->
p_next
=
NULL
;
sout_BufferChain
(
out
,
id
->
p_current_buffer
);
}
...
...
@@ -1953,7 +1980,7 @@ static int transrate_video_process( sout_stream_t *p_stream,
}
id
->
p_current_buffer
=
p_next
;
}
if
(
id
->
i_next_gop_duration
)
{
mtime_t
i_bitrate
=
(
mtime_t
)
id
->
i_next_gop_size
*
8000
...
...
@@ -1963,26 +1990,26 @@ static int transrate_video_process( sout_stream_t *p_stream,
if
(
i_old_bitrate
)
{
msg_Dbg
(
p_stream
,
"bitrate = %lld -> %lld"
,
i_old_bitrate
,
(
mtime_t
)
outbytecn
t
*
8000
/
(
i_old_duration
/
1000
));
(
mtime_t
)
bs
->
i_byte_ou
t
*
8000
/
(
i_old_duration
/
1000
));
}
i_old_bitrate
=
i_bitrate
;
i_old_duration
=
id
->
i_next_gop_duration
;
if
(
i_bitrate
>
p_sys
->
i_vbitrate
)
if
(
i_bitrate
>
p_s
tream
->
p_s
ys
->
i_vbitrate
)
{
fact_x
=
(
double
)
i_bitrate
/
p_sys
->
i_vbitrate
;
tr
->
fact_x
=
(
double
)
i_bitrate
/
p_stream
->
p_sys
->
i_vbitrate
;
}
else
{
fact_x
=
1
.
0
;
tr
->
fact_x
=
1
.
0
;
}
msg_Dbg
(
p_stream
,
"new fact_x = %f"
,
fact_x
);
msg_Dbg
(
p_stream
,
"new fact_x = %f"
,
tr
->
fact_x
);
id
->
p_current_buffer
=
id
->
p_next_gop
;
id
->
p_next_gop
=
NULL
;
id
->
i_next_gop_duration
=
0
;
id
->
i_next_gop_size
=
0
;
inbytecnt
=
0
;
outbytecn
t
=
0
;
bs
->
i_byte_in
=
0
;
bs
->
i_byte_ou
t
=
0
;
}
}
...
...
@@ -1994,9 +2021,9 @@ static int transrate_video_process( sout_stream_t *p_stream,
if
(
id
->
p_current_buffer
!=
NULL
)
{
sout_buffer_t
*
p_next
=
id
->
p_current_buffer
->
p_next
;
if
(
fact_x
==
1
.
0
)
if
(
tr
->
fact_x
==
1
.
0
)
{
outbytecn
t
+=
id
->
p_current_buffer
->
i_size
;
bs
->
i_byte_ou
t
+=
id
->
p_current_buffer
->
i_size
;
id
->
p_current_buffer
->
p_next
=
NULL
;
sout_BufferChain
(
out
,
id
->
p_current_buffer
);
}
...
...
@@ -2011,24 +2038,3 @@ static int transrate_video_process( sout_stream_t *p_stream,
return
VLC_SUCCESS
;
}
static
int
transrate_video_new
(
sout_stream_t
*
p_stream
,
sout_stream_id_t
*
id
)
{
id
->
p_current_buffer
=
NULL
;
id
->
p_next_gop
=
NULL
;
id
->
i_next_gop_duration
=
0
;
id
->
i_next_gop_size
=
0
;
p_sys
=
p_stream
->
p_sys
;
inbytecnt
=
outbytecnt
=
0
;
quant_corr
=
0
.
0
;
fact_x
=
1
.
0
;
return
VLC_SUCCESS
;
}
static
void
transrate_video_close
(
sout_stream_t
*
p_stream
,
sout_stream_id_t
*
id
)
{
}
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