Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
FFmpeg
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
libremedia
Tethys
FFmpeg
Commits
60a42ef4
Commit
60a42ef4
authored
12 years ago
by
Anton Khirnov
Browse files
Options
Downloads
Patches
Plain Diff
truemotion2: cosmetics, reformat
parent
df903683
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
libavcodec/truemotion2.c
+150
-122
150 additions, 122 deletions
libavcodec/truemotion2.c
with
150 additions
and
122 deletions
libavcodec/truemotion2.c
+
150
−
122
View file @
60a42ef4
...
...
@@ -31,14 +31,31 @@
#define TM2_ESCAPE 0x80000000
#define TM2_DELTAS 64
/* Huffman-coded streams of different types of blocks */
enum
TM2_STREAMS
{
TM2_C_HI
=
0
,
TM2_C_LO
,
TM2_L_HI
,
TM2_L_LO
,
TM2_UPD
,
TM2_MOT
,
TM2_TYPE
,
TM2_NUM_STREAMS
};
enum
TM2_STREAMS
{
TM2_C_HI
=
0
,
TM2_C_LO
,
TM2_L_HI
,
TM2_L_LO
,
TM2_UPD
,
TM2_MOT
,
TM2_TYPE
,
TM2_NUM_STREAMS
};
/* Block types */
enum
TM2_BLOCKS
{
TM2_HI_RES
=
0
,
TM2_MED_RES
,
TM2_LOW_RES
,
TM2_NULL_RES
,
TM2_UPDATE
,
TM2_STILL
,
TM2_MOTION
};
enum
TM2_BLOCKS
{
TM2_HI_RES
=
0
,
TM2_MED_RES
,
TM2_LOW_RES
,
TM2_NULL_RES
,
TM2_UPDATE
,
TM2_STILL
,
TM2_MOTION
};
typedef
struct
TM2Context
{
typedef
struct
TM2Context
{
AVCodecContext
*
avctx
;
AVFrame
pic
;
...
...
@@ -66,7 +83,7 @@ typedef struct TM2Context{
/**
* Huffman codes for each of streams
*/
typedef
struct
TM2Codes
{
typedef
struct
TM2Codes
{
VLC
vlc
;
///< table for Libav bitstream reader
int
bits
;
int
*
recode
;
///< table for converting from code indexes to values
...
...
@@ -76,7 +93,7 @@ typedef struct TM2Codes{
/**
* structure for gathering Huffman codes information
*/
typedef
struct
TM2Huff
{
typedef
struct
TM2Huff
{
int
val_bits
;
///< length of literal
int
max_bits
;
///< maximum length of code
int
min_bits
;
///< minimum length of code
...
...
@@ -91,16 +108,17 @@ typedef struct TM2Huff{
static
int
tm2_read_tree
(
TM2Context
*
ctx
,
uint32_t
prefix
,
int
length
,
TM2Huff
*
huff
)
{
int
ret
;
if
(
length
>
huff
->
max_bits
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Tree exceeded its given depth (%i)
\n
"
,
huff
->
max_bits
);
if
(
length
>
huff
->
max_bits
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Tree exceeded its given depth (%i)
\n
"
,
huff
->
max_bits
);
return
AVERROR_INVALIDDATA
;
}
if
(
!
get_bits1
(
&
ctx
->
gb
))
{
/* literal */
if
(
!
get_bits1
(
&
ctx
->
gb
))
{
/* literal */
if
(
length
==
0
)
{
length
=
1
;
}
if
(
huff
->
num
>=
huff
->
max_num
)
{
if
(
huff
->
num
>=
huff
->
max_num
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_DEBUG
,
"Too many literals
\n
"
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -126,29 +144,30 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
huff
.
val_bits
=
get_bits
(
&
ctx
->
gb
,
5
);
huff
.
max_bits
=
get_bits
(
&
ctx
->
gb
,
5
);
huff
.
min_bits
=
get_bits
(
&
ctx
->
gb
,
5
);
huff
.
nodes
=
get_bits_long
(
&
ctx
->
gb
,
17
);
huff
.
num
=
0
;
huff
.
nodes
=
get_bits_long
(
&
ctx
->
gb
,
17
);
huff
.
num
=
0
;
/* check for correct codes parameters */
if
((
huff
.
val_bits
<
1
)
||
(
huff
.
val_bits
>
32
)
||
(
huff
.
max_bits
<
0
)
||
(
huff
.
max_bits
>
25
))
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect tree parameters - literal
length: %i, max code length: %i
\n
"
,
huff
.
val_bits
,
huff
.
max_bits
);
if
((
huff
.
val_bits
<
1
)
||
(
huff
.
val_bits
>
32
)
||
(
huff
.
max_bits
<
0
)
||
(
huff
.
max_bits
>
25
))
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect tree parameters - literal
"
"length: %i, max code length: %i
\n
"
,
huff
.
val_bits
,
huff
.
max_bits
);
return
AVERROR_INVALIDDATA
;
}
if
((
huff
.
nodes
<=
0
)
||
(
huff
.
nodes
>
0x10000
))
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect number of Huffman tree nodes: %i
\n
"
,
huff
.
nodes
);
if
((
huff
.
nodes
<=
0
)
||
(
huff
.
nodes
>
0x10000
))
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect number of Huffman tree "
"nodes: %i
\n
"
,
huff
.
nodes
);
return
AVERROR_INVALIDDATA
;
}
/* one-node tree */
if
(
huff
.
max_bits
==
0
)
if
(
huff
.
max_bits
==
0
)
huff
.
max_bits
=
1
;
/* allocate space for codes - it is exactly ceil(nodes / 2) entries */
huff
.
max_num
=
(
huff
.
nodes
+
1
)
>>
1
;
huff
.
nums
=
av_mallocz
(
huff
.
max_num
*
sizeof
(
int
));
huff
.
bits
=
av_mallocz
(
huff
.
max_num
*
sizeof
(
uint32_t
));
huff
.
lens
=
av_mallocz
(
huff
.
max_num
*
sizeof
(
int
));
huff
.
nums
=
av_mallocz
(
huff
.
max_num
*
sizeof
(
int
));
huff
.
bits
=
av_mallocz
(
huff
.
max_num
*
sizeof
(
uint32_t
));
huff
.
lens
=
av_mallocz
(
huff
.
max_num
*
sizeof
(
int
));
res
=
tm2_read_tree
(
ctx
,
0
,
0
,
&
huff
);
...
...
@@ -159,19 +178,19 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
}
/* convert codes to vlc_table */
if
(
res
>=
0
)
{
if
(
res
>=
0
)
{
int
i
;
res
=
init_vlc
(
&
code
->
vlc
,
huff
.
max_bits
,
huff
.
max_num
,
huff
.
lens
,
sizeof
(
int
),
sizeof
(
int
),
huff
.
bits
,
sizeof
(
uint32_t
),
sizeof
(
uint32_t
),
0
);
if
(
res
<
0
)
huff
.
lens
,
sizeof
(
int
),
sizeof
(
int
),
huff
.
bits
,
sizeof
(
uint32_t
),
sizeof
(
uint32_t
),
0
);
if
(
res
<
0
)
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Cannot build VLC table
\n
"
);
else
{
code
->
bits
=
huff
.
max_bits
;
code
->
length
=
huff
.
max_num
;
code
->
recode
=
av_malloc
(
code
->
length
*
sizeof
(
int
));
for
(
i
=
0
;
i
<
code
->
length
;
i
++
)
for
(
i
=
0
;
i
<
code
->
length
;
i
++
)
code
->
recode
[
i
]
=
huff
.
nums
[
i
];
}
}
...
...
@@ -186,7 +205,7 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
static
void
tm2_free_codes
(
TM2Codes
*
code
)
{
av_free
(
code
->
recode
);
if
(
code
->
vlc
.
table
)
if
(
code
->
vlc
.
table
)
ff_free_vlc
(
&
code
->
vlc
);
}
...
...
@@ -216,26 +235,27 @@ static inline int tm2_read_header(TM2Context *ctx, const uint8_t *buf)
}
}
static
int
tm2_read_deltas
(
TM2Context
*
ctx
,
int
stream_id
)
{
static
int
tm2_read_deltas
(
TM2Context
*
ctx
,
int
stream_id
)
{
int
d
,
mb
;
int
i
,
v
;
d
=
get_bits
(
&
ctx
->
gb
,
9
);
d
=
get_bits
(
&
ctx
->
gb
,
9
);
mb
=
get_bits
(
&
ctx
->
gb
,
5
);
if
((
d
<
1
)
||
(
d
>
TM2_DELTAS
)
||
(
mb
<
1
)
||
(
mb
>
32
))
{
if
((
d
<
1
)
||
(
d
>
TM2_DELTAS
)
||
(
mb
<
1
)
||
(
mb
>
32
))
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect delta table: %i deltas x %i bits
\n
"
,
d
,
mb
);
return
AVERROR_INVALIDDATA
;
}
for
(
i
=
0
;
i
<
d
;
i
++
)
{
for
(
i
=
0
;
i
<
d
;
i
++
)
{
v
=
get_bits_long
(
&
ctx
->
gb
,
mb
);
if
(
v
&
(
1
<<
(
mb
-
1
)))
if
(
v
&
(
1
<<
(
mb
-
1
)))
ctx
->
deltas
[
stream_id
][
i
]
=
v
-
(
1
<<
mb
);
else
ctx
->
deltas
[
stream_id
][
i
]
=
v
;
}
for
(;
i
<
TM2_DELTAS
;
i
++
)
for
(;
i
<
TM2_DELTAS
;
i
++
)
ctx
->
deltas
[
stream_id
][
i
]
=
0
;
return
0
;
...
...
@@ -254,7 +274,7 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
len
=
bytestream2_get_be32
(
&
gb
);
skip
=
len
*
4
+
4
;
if
(
len
==
0
)
if
(
len
==
0
)
return
4
;
if
(
len
>=
INT_MAX
/
4
-
1
||
len
<
0
||
len
>
buf_size
)
{
...
...
@@ -263,12 +283,12 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
}
toks
=
bytestream2_get_be32
(
&
gb
);
if
(
toks
&
1
)
{
if
(
toks
&
1
)
{
len
=
bytestream2_get_be32
(
&
gb
);
if
(
len
==
TM2_ESCAPE
)
{
if
(
len
==
TM2_ESCAPE
)
{
len
=
bytestream2_get_be32
(
&
gb
);
}
if
(
len
>
0
)
{
if
(
len
>
0
)
{
pos
=
bytestream2_tell
(
&
gb
);
if
(
skip
<=
pos
)
return
AVERROR_INVALIDDATA
;
...
...
@@ -280,7 +300,7 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
}
/* skip unused fields */
len
=
bytestream2_get_be32
(
&
gb
);
if
(
len
==
TM2_ESCAPE
)
{
/* some unknown length - could be escaped too */
if
(
len
==
TM2_ESCAPE
)
{
/* some unknown length - could be escaped too */
bytestream2_skip
(
&
gb
,
8
);
/* unused by decoder */
}
else
{
bytestream2_skip
(
&
gb
,
4
);
/* unused by decoder */
...
...
@@ -296,20 +316,20 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
toks
>>=
1
;
/* check if we have sane number of tokens */
if
((
toks
<
0
)
||
(
toks
>
0xFFFFFF
)){
if
((
toks
<
0
)
||
(
toks
>
0xFFFFFF
))
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect number of tokens: %i
\n
"
,
toks
);
tm2_free_codes
(
&
codes
);
return
AVERROR_INVALIDDATA
;
}
ctx
->
tokens
[
stream_id
]
=
av_realloc
(
ctx
->
tokens
[
stream_id
],
toks
*
sizeof
(
int
));
ctx
->
tokens
[
stream_id
]
=
av_realloc
(
ctx
->
tokens
[
stream_id
],
toks
*
sizeof
(
int
));
ctx
->
tok_lens
[
stream_id
]
=
toks
;
len
=
bytestream2_get_be32
(
&
gb
);
if
(
len
>
0
)
{
if
(
len
>
0
)
{
pos
=
bytestream2_tell
(
&
gb
);
if
(
skip
<=
pos
)
return
AVERROR_INVALIDDATA
;
init_get_bits
(
&
ctx
->
gb
,
buf
+
pos
,
(
skip
-
pos
)
*
8
);
for
(
i
=
0
;
i
<
toks
;
i
++
)
{
for
(
i
=
0
;
i
<
toks
;
i
++
)
{
if
(
get_bits_left
(
&
ctx
->
gb
)
<=
0
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Incorrect number of tokens: %i
\n
"
,
toks
);
return
AVERROR_INVALIDDATA
;
...
...
@@ -322,7 +342,7 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
}
}
}
else
{
for
(
i
=
0
;
i
<
toks
;
i
++
)
{
for
(
i
=
0
;
i
<
toks
;
i
++
)
{
ctx
->
tokens
[
stream_id
][
i
]
=
codes
.
recode
[
0
];
if
(
stream_id
<=
TM2_MOT
&&
ctx
->
tokens
[
stream_id
][
i
]
>=
TM2_DELTAS
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Invalid delta token index %d for type %d, n=%d
\n
"
,
...
...
@@ -336,12 +356,13 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
return
skip
;
}
static
inline
int
GET_TOK
(
TM2Context
*
ctx
,
int
type
)
{
if
(
ctx
->
tok_ptrs
[
type
]
>=
ctx
->
tok_lens
[
type
])
{
static
inline
int
GET_TOK
(
TM2Context
*
ctx
,
int
type
)
{
if
(
ctx
->
tok_ptrs
[
type
]
>=
ctx
->
tok_lens
[
type
])
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Read token from stream %i out of bounds (%i>=%i)
\n
"
,
type
,
ctx
->
tok_ptrs
[
type
],
ctx
->
tok_lens
[
type
]);
return
0
;
}
if
(
type
<=
TM2_MOT
)
if
(
type
<=
TM2_MOT
)
return
ctx
->
deltas
[
type
][
ctx
->
tokens
[
type
][
ctx
->
tok_ptrs
[
type
]
++
]];
return
ctx
->
tokens
[
type
][
ctx
->
tok_ptrs
[
type
]
++
];
}
...
...
@@ -388,15 +409,15 @@ static inline void tm2_apply_deltas(TM2Context *ctx, int* Y, int stride, int *de
int
ct
,
d
;
int
i
,
j
;
for
(
j
=
0
;
j
<
4
;
j
++
){
for
(
j
=
0
;
j
<
4
;
j
++
){
ct
=
ctx
->
D
[
j
];
for
(
i
=
0
;
i
<
4
;
i
++
){
d
=
deltas
[
i
+
j
*
4
];
ct
+=
d
;
for
(
i
=
0
;
i
<
4
;
i
++
){
d
=
deltas
[
i
+
j
*
4
];
ct
+=
d
;
last
[
i
]
+=
ct
;
Y
[
i
]
=
av_clip_uint8
(
last
[
i
]);
Y
[
i
]
=
av_clip_uint8
(
last
[
i
]);
}
Y
+=
stride
;
Y
+=
stride
;
ctx
->
D
[
j
]
=
ct
;
}
}
...
...
@@ -404,11 +425,11 @@ static inline void tm2_apply_deltas(TM2Context *ctx, int* Y, int stride, int *de
static
inline
void
tm2_high_chroma
(
int
*
data
,
int
stride
,
int
*
last
,
int
*
CD
,
int
*
deltas
)
{
int
i
,
j
;
for
(
j
=
0
;
j
<
2
;
j
++
){
for
(
i
=
0
;
i
<
2
;
i
++
){
CD
[
j
]
+=
deltas
[
i
+
j
*
2
];
for
(
j
=
0
;
j
<
2
;
j
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
CD
[
j
]
+=
deltas
[
i
+
j
*
2
];
last
[
i
]
+=
CD
[
j
];
data
[
i
]
=
last
[
i
];
data
[
i
]
=
last
[
i
];
}
data
+=
stride
;
}
...
...
@@ -420,14 +441,14 @@ static inline void tm2_low_chroma(int *data, int stride, int *clast, int *CD, in
int
l
;
int
prev
;
if
(
bx
>
0
)
if
(
bx
>
0
)
prev
=
clast
[
-
3
];
else
prev
=
0
;
t
=
(
CD
[
0
]
+
CD
[
1
])
>>
1
;
l
=
(
prev
-
CD
[
0
]
-
CD
[
1
]
+
clast
[
1
])
>>
1
;
CD
[
1
]
=
CD
[
0
]
+
CD
[
1
]
-
t
;
CD
[
0
]
=
t
;
t
=
(
CD
[
0
]
+
CD
[
1
])
>>
1
;
l
=
(
prev
-
CD
[
0
]
-
CD
[
1
]
+
clast
[
1
])
>>
1
;
CD
[
1
]
=
CD
[
0
]
+
CD
[
1
]
-
t
;
CD
[
0
]
=
t
;
clast
[
0
]
=
l
;
tm2_high_chroma
(
data
,
stride
,
clast
,
CD
,
deltas
);
...
...
@@ -440,15 +461,15 @@ static inline void tm2_hi_res_block(TM2Context *ctx, AVFrame *pic, int bx, int b
TM2_INIT_POINTERS
();
/* hi-res chroma */
for
(
i
=
0
;
i
<
4
;
i
++
)
{
deltas
[
i
]
=
GET_TOK
(
ctx
,
TM2_C_HI
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
deltas
[
i
]
=
GET_TOK
(
ctx
,
TM2_C_HI
);
deltas
[
i
+
4
]
=
GET_TOK
(
ctx
,
TM2_C_HI
);
}
tm2_high_chroma
(
U
,
Ustride
,
clast
,
ctx
->
CD
,
deltas
);
tm2_high_chroma
(
U
,
Ustride
,
clast
,
ctx
->
CD
,
deltas
);
tm2_high_chroma
(
V
,
Vstride
,
clast
+
2
,
ctx
->
CD
+
2
,
deltas
+
4
);
/* hi-res luma */
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
deltas
[
i
]
=
GET_TOK
(
ctx
,
TM2_L_HI
);
tm2_apply_deltas
(
ctx
,
Y
,
Ystride
,
deltas
,
last
);
...
...
@@ -470,7 +491,7 @@ static inline void tm2_med_res_block(TM2Context *ctx, AVFrame *pic, int bx, int
tm2_low_chroma
(
V
,
Vstride
,
clast
+
2
,
ctx
->
CD
+
2
,
deltas
,
bx
);
/* hi-res luma */
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
deltas
[
i
]
=
GET_TOK
(
ctx
,
TM2_L_HI
);
tm2_apply_deltas
(
ctx
,
Y
,
Ystride
,
deltas
,
last
);
...
...
@@ -493,7 +514,7 @@ static inline void tm2_low_res_block(TM2Context *ctx, AVFrame *pic, int bx, int
tm2_low_chroma
(
V
,
Vstride
,
clast
+
2
,
ctx
->
CD
+
2
,
deltas
,
bx
);
/* low-res luma */
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
deltas
[
i
]
=
0
;
deltas
[
0
]
=
GET_TOK
(
ctx
,
TM2_L_LO
);
...
...
@@ -501,7 +522,7 @@ static inline void tm2_low_res_block(TM2Context *ctx, AVFrame *pic, int bx, int
deltas
[
8
]
=
GET_TOK
(
ctx
,
TM2_L_LO
);
deltas
[
10
]
=
GET_TOK
(
ctx
,
TM2_L_LO
);
if
(
bx
>
0
)
if
(
bx
>
0
)
last
[
0
]
=
(
last
[
-
1
]
-
ctx
->
D
[
0
]
-
ctx
->
D
[
1
]
-
ctx
->
D
[
2
]
-
ctx
->
D
[
3
]
+
last
[
1
])
>>
1
;
else
last
[
0
]
=
(
last
[
1
]
-
ctx
->
D
[
0
]
-
ctx
->
D
[
1
]
-
ctx
->
D
[
2
]
-
ctx
->
D
[
3
])
>>
1
;
...
...
@@ -533,18 +554,18 @@ static inline void tm2_null_res_block(TM2Context *ctx, AVFrame *pic, int bx, int
tm2_low_chroma
(
V
,
Vstride
,
clast
+
2
,
ctx
->
CD
+
2
,
deltas
,
bx
);
/* null luma */
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
deltas
[
i
]
=
0
;
ct
=
ctx
->
D
[
0
]
+
ctx
->
D
[
1
]
+
ctx
->
D
[
2
]
+
ctx
->
D
[
3
];
if
(
bx
>
0
)
if
(
bx
>
0
)
left
=
last
[
-
1
]
-
ct
;
else
left
=
0
;
right
=
last
[
3
];
diff
=
right
-
left
;
right
=
last
[
3
];
diff
=
right
-
left
;
last
[
0
]
=
left
+
(
diff
>>
2
);
last
[
1
]
=
left
+
(
diff
>>
1
);
last
[
2
]
=
right
-
(
diff
>>
2
);
...
...
@@ -553,11 +574,11 @@ static inline void tm2_null_res_block(TM2Context *ctx, AVFrame *pic, int bx, int
int
tp
=
left
;
ctx
->
D
[
0
]
=
(
tp
+
(
ct
>>
2
))
-
left
;
left
+=
ctx
->
D
[
0
];
left
+=
ctx
->
D
[
0
];
ctx
->
D
[
1
]
=
(
tp
+
(
ct
>>
1
))
-
left
;
left
+=
ctx
->
D
[
1
];
left
+=
ctx
->
D
[
1
];
ctx
->
D
[
2
]
=
((
tp
+
ct
)
-
(
ct
>>
2
))
-
left
;
left
+=
ctx
->
D
[
2
];
left
+=
ctx
->
D
[
2
];
ctx
->
D
[
3
]
=
(
tp
+
ct
)
-
left
;
}
tm2_apply_deltas
(
ctx
,
Y
,
Ystride
,
deltas
,
last
);
...
...
@@ -569,12 +590,12 @@ static inline void tm2_still_block(TM2Context *ctx, AVFrame *pic, int bx, int by
TM2_INIT_POINTERS_2
();
/* update chroma */
for
(
j
=
0
;
j
<
2
;
j
++
){
for
(
i
=
0
;
i
<
2
;
i
++
){
for
(
j
=
0
;
j
<
2
;
j
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
){
U
[
i
]
=
Uo
[
i
];
V
[
i
]
=
Vo
[
i
];
}
U
+=
Ustride
;
V
+=
Vstride
;
U
+=
Ustride
;
V
+=
Vstride
;
Uo
+=
oUstride
;
Vo
+=
oVstride
;
}
U
-=
Ustride
*
2
;
...
...
@@ -588,12 +609,12 @@ static inline void tm2_still_block(TM2Context *ctx, AVFrame *pic, int bx, int by
ctx
->
D
[
2
]
=
Yo
[
3
+
oYstride
*
2
]
-
Yo
[
3
+
oYstride
];
ctx
->
D
[
3
]
=
Yo
[
3
+
oYstride
*
3
]
-
Yo
[
3
+
oYstride
*
2
];
for
(
j
=
0
;
j
<
4
;
j
++
){
for
(
i
=
0
;
i
<
4
;
i
++
){
Y
[
i
]
=
Yo
[
i
];
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
Y
[
i
]
=
Yo
[
i
];
last
[
i
]
=
Yo
[
i
];
}
Y
+=
Ystride
;
Y
+=
Ystride
;
Yo
+=
oYstride
;
}
}
...
...
@@ -605,13 +626,15 @@ static inline void tm2_update_block(TM2Context *ctx, AVFrame *pic, int bx, int b
TM2_INIT_POINTERS_2
();
/* update chroma */
for
(
j
=
0
;
j
<
2
;
j
++
){
for
(
i
=
0
;
i
<
2
;
i
++
){
for
(
j
=
0
;
j
<
2
;
j
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
U
[
i
]
=
Uo
[
i
]
+
GET_TOK
(
ctx
,
TM2_UPD
);
V
[
i
]
=
Vo
[
i
]
+
GET_TOK
(
ctx
,
TM2_UPD
);
}
U
+=
Ustride
;
V
+=
Vstride
;
Uo
+=
oUstride
;
Vo
+=
oVstride
;
U
+=
Ustride
;
V
+=
Vstride
;
Uo
+=
oUstride
;
Vo
+=
oVstride
;
}
U
-=
Ustride
*
2
;
V
-=
Vstride
*
2
;
...
...
@@ -624,14 +647,14 @@ static inline void tm2_update_block(TM2Context *ctx, AVFrame *pic, int bx, int b
ctx
->
D
[
2
]
=
Yo
[
3
+
oYstride
*
2
]
-
Yo
[
3
+
oYstride
];
ctx
->
D
[
3
]
=
Yo
[
3
+
oYstride
*
3
]
-
Yo
[
3
+
oYstride
*
2
];
for
(
j
=
0
;
j
<
4
;
j
++
){
for
(
j
=
0
;
j
<
4
;
j
++
)
{
d
=
last
[
3
];
for
(
i
=
0
;
i
<
4
;
i
++
){
Y
[
i
]
=
Yo
[
i
]
+
GET_TOK
(
ctx
,
TM2_UPD
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
Y
[
i
]
=
Yo
[
i
]
+
GET_TOK
(
ctx
,
TM2_UPD
);
last
[
i
]
=
Y
[
i
];
}
ctx
->
D
[
j
]
=
last
[
3
]
-
d
;
Y
+=
Ystride
;
Y
+=
Ystride
;
Yo
+=
oYstride
;
}
}
...
...
@@ -652,13 +675,15 @@ static inline void tm2_motion_block(TM2Context *ctx, AVFrame *pic, int bx, int b
Vo
+=
(
my
>>
1
)
*
oVstride
+
(
mx
>>
1
);
/* copy chroma */
for
(
j
=
0
;
j
<
2
;
j
++
){
for
(
i
=
0
;
i
<
2
;
i
++
){
for
(
j
=
0
;
j
<
2
;
j
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
U
[
i
]
=
Uo
[
i
];
V
[
i
]
=
Vo
[
i
];
}
U
+=
Ustride
;
V
+=
Vstride
;
Uo
+=
oUstride
;
Vo
+=
oVstride
;
U
+=
Ustride
;
V
+=
Vstride
;
Uo
+=
oUstride
;
Vo
+=
oVstride
;
}
U
-=
Ustride
*
2
;
V
-=
Vstride
*
2
;
...
...
@@ -666,11 +691,11 @@ static inline void tm2_motion_block(TM2Context *ctx, AVFrame *pic, int bx, int b
TM2_RECALC_BLOCK
(
V
,
Vstride
,
(
clast
+
2
),
(
ctx
->
CD
+
2
));
/* copy luma */
for
(
j
=
0
;
j
<
4
;
j
++
){
for
(
i
=
0
;
i
<
4
;
i
++
){
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
Y
[
i
]
=
Yo
[
i
];
}
Y
+=
Ystride
;
Y
+=
Ystride
;
Yo
+=
oYstride
;
}
/* calculate deltas */
...
...
@@ -679,7 +704,7 @@ static inline void tm2_motion_block(TM2Context *ctx, AVFrame *pic, int bx, int b
ctx
->
D
[
1
]
=
Y
[
3
+
Ystride
]
-
Y
[
3
];
ctx
->
D
[
2
]
=
Y
[
3
+
Ystride
*
2
]
-
Y
[
3
+
Ystride
];
ctx
->
D
[
3
]
=
Y
[
3
+
Ystride
*
3
]
-
Y
[
3
+
Ystride
*
2
];
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
last
[
i
]
=
Y
[
i
+
Ystride
*
3
];
}
...
...
@@ -692,10 +717,10 @@ static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p)
int
*
Y
,
*
U
,
*
V
;
uint8_t
*
dst
;
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
ctx
->
tok_ptrs
[
i
]
=
0
;
if
(
ctx
->
tok_lens
[
TM2_TYPE
]
<
bw
*
bh
){
if
(
ctx
->
tok_lens
[
TM2_TYPE
]
<
bw
*
bh
)
{
av_log
(
ctx
->
avctx
,
AV_LOG_ERROR
,
"Got %i tokens for %i blocks
\n
"
,
ctx
->
tok_lens
[
TM2_TYPE
],
bw
*
bh
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -703,10 +728,10 @@ static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p)
memset
(
ctx
->
last
,
0
,
4
*
bw
*
sizeof
(
int
));
memset
(
ctx
->
clast
,
0
,
4
*
bw
*
sizeof
(
int
));
for
(
j
=
0
;
j
<
bh
;
j
++
)
{
for
(
j
=
0
;
j
<
bh
;
j
++
)
{
memset
(
ctx
->
D
,
0
,
4
*
sizeof
(
int
));
memset
(
ctx
->
CD
,
0
,
4
*
sizeof
(
int
));
for
(
i
=
0
;
i
<
bw
;
i
++
)
{
for
(
i
=
0
;
i
<
bw
;
i
++
)
{
type
=
GET_TOK
(
ctx
,
TM2_TYPE
);
switch
(
type
)
{
case
TM2_HI_RES
:
...
...
@@ -744,8 +769,8 @@ static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p)
U
=
(
ctx
->
cur
?
ctx
->
U2
:
ctx
->
U1
);
V
=
(
ctx
->
cur
?
ctx
->
V2
:
ctx
->
V1
);
dst
=
p
->
data
[
0
];
for
(
j
=
0
;
j
<
h
;
j
++
){
for
(
i
=
0
;
i
<
w
;
i
++
){
for
(
j
=
0
;
j
<
h
;
j
++
)
{
for
(
i
=
0
;
i
<
w
;
i
++
)
{
int
y
=
Y
[
i
],
u
=
U
[
i
>>
1
],
v
=
V
[
i
>>
1
];
dst
[
3
*
i
+
0
]
=
av_clip_uint8
(
y
+
v
);
dst
[
3
*
i
+
1
]
=
av_clip_uint8
(
y
);
...
...
@@ -809,15 +834,16 @@ static int decode_frame(AVCodecContext *avctx,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
{
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
&
~
3
;
TM2Context
*
const
l
=
avctx
->
priv_data
;
AVFrame
*
const
p
=
&
l
->
pic
;
int
i
,
offset
=
TM2_HEADER_SIZE
,
t
,
ret
;
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
&
~
3
;
AVFrame
*
const
p
=
&
l
->
pic
;
int
offset
=
TM2_HEADER_SIZE
;
int
i
,
t
,
ret
;
uint8_t
*
swbuf
;
swbuf
=
av_malloc
(
buf_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
if
(
!
swbuf
){
if
(
!
swbuf
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Cannot allocate temporary buffer
\n
"
);
return
AVERROR
(
ENOMEM
);
}
...
...
@@ -836,21 +862,21 @@ static int decode_frame(AVCodecContext *avctx,
return
ret
;
}
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
){
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
{
if
(
offset
>=
buf_size
)
{
av_free
(
swbuf
);
return
AVERROR_INVALIDDATA
;
}
t
=
tm2_read_stream
(
l
,
swbuf
+
offset
,
tm2_stream_order
[
i
],
buf_size
-
offset
);
if
(
t
<
0
){
if
(
t
<
0
)
{
av_free
(
swbuf
);
return
t
;
}
offset
+=
t
;
}
p
->
key_frame
=
tm2_decode_blocks
(
l
,
p
);
if
(
p
->
key_frame
)
if
(
p
->
key_frame
)
p
->
pict_type
=
AV_PICTURE_TYPE_I
;
else
p
->
pict_type
=
AV_PICTURE_TYPE_P
;
...
...
@@ -863,17 +889,18 @@ static int decode_frame(AVCodecContext *avctx,
return
buf_size
;
}
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
){
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
)
{
TM2Context
*
const
l
=
avctx
->
priv_data
;
int
i
,
w
=
avctx
->
width
,
h
=
avctx
->
height
;
if
((
avctx
->
width
&
3
)
||
(
avctx
->
height
&
3
)){
if
((
avctx
->
width
&
3
)
||
(
avctx
->
height
&
3
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Width and height must be multiple of 4
\n
"
);
return
AVERROR
(
EINVAL
);
}
l
->
avctx
=
avctx
;
l
->
pic
.
data
[
0
]
=
NULL
;
l
->
avctx
=
avctx
;
l
->
pic
.
data
[
0
]
=
NULL
;
avctx
->
pix_fmt
=
AV_PIX_FMT_BGR24
;
ff_dsputil_init
(
&
l
->
dsp
,
avctx
);
...
...
@@ -881,7 +908,7 @@ static av_cold int decode_init(AVCodecContext *avctx){
l
->
last
=
av_malloc
(
4
*
sizeof
(
*
l
->
last
)
*
(
w
>>
2
));
l
->
clast
=
av_malloc
(
4
*
sizeof
(
*
l
->
clast
)
*
(
w
>>
2
));
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
{
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
{
l
->
tokens
[
i
]
=
NULL
;
l
->
tok_lens
[
i
]
=
0
;
}
...
...
@@ -922,16 +949,17 @@ static av_cold int decode_init(AVCodecContext *avctx){
return
0
;
}
static
av_cold
int
decode_end
(
AVCodecContext
*
avctx
){
static
av_cold
int
decode_end
(
AVCodecContext
*
avctx
)
{
TM2Context
*
const
l
=
avctx
->
priv_data
;
AVFrame
*
pic
=
&
l
->
pic
;
int
i
;
av_free
(
l
->
last
);
av_free
(
l
->
clast
);
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
for
(
i
=
0
;
i
<
TM2_NUM_STREAMS
;
i
++
)
av_free
(
l
->
tokens
[
i
]);
if
(
l
->
Y1
){
if
(
l
->
Y1
)
{
av_free
(
l
->
Y1_base
);
av_free
(
l
->
U1_base
);
av_free
(
l
->
V1_base
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment