Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
89d26797
Commit
89d26797
authored
Jan 04, 2012
by
Ronald S. Bultje
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ulti: convert to new bytestream API.
parent
3d72a6f1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
38 additions
and
40 deletions
+38
-40
bytestream.h
libavcodec/bytestream.h
+5
-1
ulti.c
libavcodec/ulti.c
+33
-39
No files found.
libavcodec/bytestream.h
View file @
89d26797
...
@@ -39,11 +39,15 @@ static av_always_inline void bytestream_put_ ##name(uint8_t **b, const type valu
...
@@ -39,11 +39,15 @@ static av_always_inline void bytestream_put_ ##name(uint8_t **b, const type valu
write(*b, value);\
write(*b, value);\
(*b) += bytes;\
(*b) += bytes;\
}\
}\
static av_always_inline type bytestream2_get_ ## name ## u(GetByteContext *g)\
{\
return bytestream_get_ ## name(&g->buffer);\
}\
static av_always_inline type bytestream2_get_ ## name(GetByteContext *g)\
static av_always_inline type bytestream2_get_ ## name(GetByteContext *g)\
{\
{\
if (g->buffer_end - g->buffer < bytes)\
if (g->buffer_end - g->buffer < bytes)\
return 0;\
return 0;\
return bytestream
_get_ ## name(&g->buffer
);\
return bytestream
2_get_ ## name ## u(g
);\
}\
}\
static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)\
static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)\
{\
{\
...
...
libavcodec/ulti.c
View file @
89d26797
...
@@ -38,16 +38,9 @@ typedef struct UltimotionDecodeContext {
...
@@ -38,16 +38,9 @@ typedef struct UltimotionDecodeContext {
int
width
,
height
,
blocks
;
int
width
,
height
,
blocks
;
AVFrame
frame
;
AVFrame
frame
;
const
uint8_t
*
ulti_codebook
;
const
uint8_t
*
ulti_codebook
;
GetByteContext
gb
;
}
UltimotionDecodeContext
;
}
UltimotionDecodeContext
;
#define CHECK_OVERREAD_SIZE(size) \
do { \
if (buf_end - buf < (size)) { \
av_log(avctx, AV_LOG_ERROR, "Insufficient data\n"); \
return AVERROR_INVALIDDATA; \
} \
} while(0)
static
av_cold
int
ulti_decode_init
(
AVCodecContext
*
avctx
)
static
av_cold
int
ulti_decode_init
(
AVCodecContext
*
avctx
)
{
{
UltimotionDecodeContext
*
s
=
avctx
->
priv_data
;
UltimotionDecodeContext
*
s
=
avctx
->
priv_data
;
...
@@ -231,7 +224,6 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -231,7 +224,6 @@ static int ulti_decode_frame(AVCodecContext *avctx,
int
i
;
int
i
;
int
skip
;
int
skip
;
int
tmp
;
int
tmp
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
s
->
frame
.
reference
=
1
;
s
->
frame
.
reference
=
1
;
s
->
frame
.
buffer_hints
=
FF_BUFFER_HINTS_VALID
|
FF_BUFFER_HINTS_PRESERVE
|
FF_BUFFER_HINTS_REUSABLE
;
s
->
frame
.
buffer_hints
=
FF_BUFFER_HINTS_VALID
|
FF_BUFFER_HINTS_PRESERVE
|
FF_BUFFER_HINTS_REUSABLE
;
...
@@ -240,18 +232,20 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -240,18 +232,20 @@ static int ulti_decode_frame(AVCodecContext *avctx,
return
-
1
;
return
-
1
;
}
}
bytestream2_init
(
&
s
->
gb
,
buf
,
buf_size
);
while
(
!
done
)
{
while
(
!
done
)
{
int
idx
;
int
idx
;
if
(
blocks
>=
s
->
blocks
||
y
>=
s
->
height
)
if
(
blocks
>=
s
->
blocks
||
y
>=
s
->
height
)
break
;
//all blocks decoded
break
;
//all blocks decoded
CHECK_OVERREAD_SIZE
(
1
);
if
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
<
1
)
idx
=
*
buf
++
;
goto
err
;
idx
=
bytestream2_get_byteu
(
&
s
->
gb
);
if
((
idx
&
0xF8
)
==
0x70
)
{
if
((
idx
&
0xF8
)
==
0x70
)
{
switch
(
idx
)
{
switch
(
idx
)
{
case
0x70
:
//change modifier
case
0x70
:
//change modifier
CHECK_OVERREAD_SIZE
(
1
);
modifier
=
bytestream2_get_byte
(
&
s
->
gb
);
modifier
=
*
buf
++
;
if
(
modifier
>
1
)
if
(
modifier
>
1
)
av_log
(
avctx
,
AV_LOG_INFO
,
"warning: modifier must be 0 or 1, got %i
\n
"
,
modifier
);
av_log
(
avctx
,
AV_LOG_INFO
,
"warning: modifier must be 0 or 1, got %i
\n
"
,
modifier
);
break
;
break
;
...
@@ -265,8 +259,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -265,8 +259,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
done
=
1
;
done
=
1
;
break
;
break
;
case
0x74
:
//skip some blocks
case
0x74
:
//skip some blocks
CHECK_OVERREAD_SIZE
(
1
);
skip
=
bytestream2_get_byte
(
&
s
->
gb
);
skip
=
*
buf
++
;
if
((
blocks
+
skip
)
>=
s
->
blocks
)
if
((
blocks
+
skip
)
>=
s
->
blocks
)
break
;
break
;
blocks
+=
skip
;
blocks
+=
skip
;
...
@@ -293,8 +286,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -293,8 +286,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
}
else
{
}
else
{
cf
=
0
;
cf
=
0
;
if
(
idx
)
{
if
(
idx
)
{
CHECK_OVERREAD_SIZE
(
1
);
chroma
=
bytestream2_get_byte
(
&
s
->
gb
);
chroma
=
*
buf
++
;
}
}
}
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
// for every subblock
for
(
i
=
0
;
i
<
4
;
i
++
)
{
// for every subblock
...
@@ -302,15 +294,13 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -302,15 +294,13 @@ static int ulti_decode_frame(AVCodecContext *avctx,
if
(
!
code
)
//skip subblock
if
(
!
code
)
//skip subblock
continue
;
continue
;
if
(
cf
)
{
if
(
cf
)
{
CHECK_OVERREAD_SIZE
(
1
);
chroma
=
bytestream2_get_byte
(
&
s
->
gb
);
chroma
=
*
buf
++
;
}
}
tx
=
x
+
block_coords
[
i
*
2
];
tx
=
x
+
block_coords
[
i
*
2
];
ty
=
y
+
block_coords
[(
i
*
2
)
+
1
];
ty
=
y
+
block_coords
[(
i
*
2
)
+
1
];
switch
(
code
)
{
switch
(
code
)
{
case
1
:
case
1
:
CHECK_OVERREAD_SIZE
(
1
);
tmp
=
bytestream2_get_byte
(
&
s
->
gb
);
tmp
=
*
buf
++
;
angle
=
angle_by_index
[(
tmp
>>
6
)
&
0x3
];
angle
=
angle_by_index
[(
tmp
>>
6
)
&
0x3
];
...
@@ -330,8 +320,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -330,8 +320,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
case
2
:
case
2
:
if
(
modifier
)
{
// unpack four luma samples
if
(
modifier
)
{
// unpack four luma samples
CHECK_OVERREAD_SIZE
(
3
);
tmp
=
bytestream2_get_be24
(
&
s
->
gb
);
tmp
=
bytestream_get_be24
(
&
buf
);
Y
[
0
]
=
(
tmp
>>
18
)
&
0x3F
;
Y
[
0
]
=
(
tmp
>>
18
)
&
0x3F
;
Y
[
1
]
=
(
tmp
>>
12
)
&
0x3F
;
Y
[
1
]
=
(
tmp
>>
12
)
&
0x3F
;
...
@@ -339,8 +328,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -339,8 +328,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
Y
[
3
]
=
tmp
&
0x3F
;
Y
[
3
]
=
tmp
&
0x3F
;
angle
=
16
;
angle
=
16
;
}
else
{
// retrieve luma samples from codebook
}
else
{
// retrieve luma samples from codebook
CHECK_OVERREAD_SIZE
(
2
);
tmp
=
bytestream2_get_be16
(
&
s
->
gb
);
tmp
=
bytestream_get_be16
(
&
buf
);
angle
=
(
tmp
>>
12
)
&
0xF
;
angle
=
(
tmp
>>
12
)
&
0xF
;
tmp
&=
0xFFF
;
tmp
&=
0xFFF
;
...
@@ -356,27 +344,27 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -356,27 +344,27 @@ static int ulti_decode_frame(AVCodecContext *avctx,
if
(
modifier
)
{
// all 16 luma samples
if
(
modifier
)
{
// all 16 luma samples
uint8_t
Luma
[
16
];
uint8_t
Luma
[
16
];
CHECK_OVERREAD_SIZE
(
12
);
if
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
<
12
)
goto
err
;
tmp
=
bytestream
_get_be24
(
&
buf
);
tmp
=
bytestream
2_get_be24u
(
&
s
->
gb
);
Luma
[
0
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
0
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
1
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
1
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
2
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
2
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
3
]
=
tmp
&
0x3F
;
Luma
[
3
]
=
tmp
&
0x3F
;
tmp
=
bytestream
_get_be24
(
&
buf
);
tmp
=
bytestream
2_get_be24u
(
&
s
->
gb
);
Luma
[
4
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
4
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
5
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
5
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
6
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
6
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
7
]
=
tmp
&
0x3F
;
Luma
[
7
]
=
tmp
&
0x3F
;
tmp
=
bytestream
_get_be24
(
&
buf
);
tmp
=
bytestream
2_get_be24u
(
&
s
->
gb
);
Luma
[
8
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
8
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
9
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
9
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
10
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
10
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
11
]
=
tmp
&
0x3F
;
Luma
[
11
]
=
tmp
&
0x3F
;
tmp
=
bytestream
_get_be24
(
&
buf
);
tmp
=
bytestream
2_get_be24u
(
&
s
->
gb
);
Luma
[
12
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
12
]
=
(
tmp
>>
18
)
&
0x3F
;
Luma
[
13
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
13
]
=
(
tmp
>>
12
)
&
0x3F
;
Luma
[
14
]
=
(
tmp
>>
6
)
&
0x3F
;
Luma
[
14
]
=
(
tmp
>>
6
)
&
0x3F
;
...
@@ -384,22 +372,23 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -384,22 +372,23 @@ static int ulti_decode_frame(AVCodecContext *avctx,
ulti_convert_yuv
(
&
s
->
frame
,
tx
,
ty
,
Luma
,
chroma
);
ulti_convert_yuv
(
&
s
->
frame
,
tx
,
ty
,
Luma
,
chroma
);
}
else
{
}
else
{
CHECK_OVERREAD_SIZE
(
4
);
if
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
<
4
)
tmp
=
*
buf
++
;
goto
err
;
tmp
=
bytestream2_get_byteu
(
&
s
->
gb
);
if
(
tmp
&
0x80
)
{
if
(
tmp
&
0x80
)
{
angle
=
(
tmp
>>
4
)
&
0x7
;
angle
=
(
tmp
>>
4
)
&
0x7
;
tmp
=
(
tmp
<<
8
)
+
*
buf
++
;
tmp
=
(
tmp
<<
8
)
+
bytestream2_get_byteu
(
&
s
->
gb
)
;
Y
[
0
]
=
(
tmp
>>
6
)
&
0x3F
;
Y
[
0
]
=
(
tmp
>>
6
)
&
0x3F
;
Y
[
1
]
=
tmp
&
0x3F
;
Y
[
1
]
=
tmp
&
0x3F
;
Y
[
2
]
=
(
*
buf
++
)
&
0x3F
;
Y
[
2
]
=
bytestream2_get_byteu
(
&
s
->
gb
)
&
0x3F
;
Y
[
3
]
=
(
*
buf
++
)
&
0x3F
;
Y
[
3
]
=
bytestream2_get_byteu
(
&
s
->
gb
)
&
0x3F
;
ulti_grad
(
&
s
->
frame
,
tx
,
ty
,
Y
,
chroma
,
angle
);
//draw block
ulti_grad
(
&
s
->
frame
,
tx
,
ty
,
Y
,
chroma
,
angle
);
//draw block
}
else
{
// some patterns
}
else
{
// some patterns
int
f0
,
f1
;
int
f0
,
f1
;
f0
=
*
buf
++
;
f0
=
bytestream2_get_byteu
(
&
s
->
gb
)
;
f1
=
tmp
;
f1
=
tmp
;
Y
[
0
]
=
(
*
buf
++
)
&
0x3F
;
Y
[
0
]
=
bytestream2_get_byteu
(
&
s
->
gb
)
&
0x3F
;
Y
[
1
]
=
(
*
buf
++
)
&
0x3F
;
Y
[
1
]
=
bytestream2_get_byteu
(
&
s
->
gb
)
&
0x3F
;
ulti_pattern
(
&
s
->
frame
,
tx
,
ty
,
f1
,
f0
,
Y
[
0
],
Y
[
1
],
chroma
);
ulti_pattern
(
&
s
->
frame
,
tx
,
ty
,
f1
,
f0
,
Y
[
0
],
Y
[
1
],
chroma
);
}
}
}
}
...
@@ -421,6 +410,11 @@ static int ulti_decode_frame(AVCodecContext *avctx,
...
@@ -421,6 +410,11 @@ static int ulti_decode_frame(AVCodecContext *avctx,
*
(
AVFrame
*
)
data
=
s
->
frame
;
*
(
AVFrame
*
)
data
=
s
->
frame
;
return
buf_size
;
return
buf_size
;
err:
av_log
(
avctx
,
AV_LOG_ERROR
,
"Insufficient data
\n
"
);
return
AVERROR_INVALIDDATA
;
}
}
AVCodec
ff_ulti_decoder
=
{
AVCodec
ff_ulti_decoder
=
{
...
...
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