Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
1f3e56b6
Commit
1f3e56b6
authored
Nov 15, 2013
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gifdec: convert to bytestream2
parent
c453723a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
38 additions
and
38 deletions
+38
-38
gifdec.c
libavcodec/gifdec.c
+33
-34
lzw.c
libavcodec/lzw.c
+4
-3
lzw.h
libavcodec/lzw.h
+1
-1
No files found.
libavcodec/gifdec.c
View file @
1f3e56b6
...
...
@@ -46,8 +46,7 @@ typedef struct GifState {
int
gce_delay
;
/* LZW compatible decoder */
const
uint8_t
*
bytestream
;
const
uint8_t
*
bytestream_end
;
GetByteContext
gb
;
LZWState
*
lzw
;
/* aux buffers */
...
...
@@ -66,11 +65,11 @@ static int gif_read_image(GifState *s, AVFrame *frame)
int
is_interleaved
,
has_local_palette
,
y
,
pass
,
y1
,
linesize
,
n
,
i
;
uint8_t
*
ptr
,
*
spal
,
*
palette
,
*
ptr1
;
left
=
bytestream_get_le16
(
&
s
->
bytestream
);
top
=
bytestream_get_le16
(
&
s
->
bytestream
);
width
=
bytestream_get_le16
(
&
s
->
bytestream
);
height
=
bytestream
_get_le16
(
&
s
->
bytestream
);
flags
=
bytestream_get_byte
(
&
s
->
bytestream
);
left
=
bytestream2_get_le16
(
&
s
->
gb
);
top
=
bytestream2_get_le16
(
&
s
->
gb
);
width
=
bytestream2_get_le16
(
&
s
->
gb
);
height
=
bytestream
2_get_le16
(
&
s
->
gb
);
flags
=
bytestream2_get_byte
(
&
s
->
gb
);
is_interleaved
=
flags
&
0x40
;
has_local_palette
=
flags
&
0x80
;
bits_per_pixel
=
(
flags
&
0x07
)
+
1
;
...
...
@@ -78,7 +77,7 @@ static int gif_read_image(GifState *s, AVFrame *frame)
av_dlog
(
s
->
avctx
,
"gif: image x=%d y=%d w=%d h=%d
\n
"
,
left
,
top
,
width
,
height
);
if
(
has_local_palette
)
{
bytestream
_get_buffer
(
&
s
->
bytestream
,
s
->
local_palette
,
3
*
(
1
<<
bits_per_pixel
));
bytestream
2_get_buffer
(
&
s
->
gb
,
s
->
local_palette
,
3
*
(
1
<<
bits_per_pixel
));
palette
=
s
->
local_palette
;
}
else
{
palette
=
s
->
global_palette
;
...
...
@@ -107,9 +106,9 @@ static int gif_read_image(GifState *s, AVFrame *frame)
s
->
image_palette
[
s
->
transparent_color_index
]
=
0
;
/* now get the image data */
code_size
=
bytestream
_get_byte
(
&
s
->
bytestream
);
ff_lzw_decode_init
(
s
->
lzw
,
code_size
,
s
->
bytestream
,
s
->
bytestream_end
-
s
->
bytestream
,
FF_LZW_GIF
);
code_size
=
bytestream
2_get_byte
(
&
s
->
gb
);
ff_lzw_decode_init
(
s
->
lzw
,
code_size
,
s
->
gb
.
buffer
,
bytestream2_get_bytes_left
(
&
s
->
gb
)
,
FF_LZW_GIF
);
/* read all the image */
linesize
=
frame
->
linesize
[
0
];
...
...
@@ -152,7 +151,8 @@ static int gif_read_image(GifState *s, AVFrame *frame)
}
/* read the garbage data until end marker is found */
ff_lzw_decode_tail
(
s
->
lzw
);
s
->
bytestream
=
ff_lzw_cur_ptr
(
s
->
lzw
);
bytestream2_skip
(
&
s
->
gb
,
ff_lzw_size_read
(
s
->
lzw
));
return
0
;
}
...
...
@@ -161,8 +161,8 @@ static int gif_read_extension(GifState *s)
int
ext_code
,
ext_len
,
i
,
gce_flags
,
gce_transparent_index
;
/* extension */
ext_code
=
bytestream
_get_byte
(
&
s
->
bytestream
);
ext_len
=
bytestream_get_byte
(
&
s
->
bytestream
);
ext_code
=
bytestream
2_get_byte
(
&
s
->
gb
);
ext_len
=
bytestream2_get_byte
(
&
s
->
gb
);
av_dlog
(
s
->
avctx
,
"gif: ext_code=0x%x len=%d
\n
"
,
ext_code
,
ext_len
);
...
...
@@ -171,9 +171,9 @@ static int gif_read_extension(GifState *s)
if
(
ext_len
!=
4
)
goto
discard_ext
;
s
->
transparent_color_index
=
-
1
;
gce_flags
=
bytestream_get_byte
(
&
s
->
bytestream
);
s
->
gce_delay
=
bytestream
_get_le16
(
&
s
->
bytestream
);
gce_transparent_index
=
bytestream
_get_byte
(
&
s
->
bytestream
);
gce_flags
=
bytestream2_get_byte
(
&
s
->
gb
);
s
->
gce_delay
=
bytestream
2_get_le16
(
&
s
->
gb
);
gce_transparent_index
=
bytestream
2_get_byte
(
&
s
->
gb
);
if
(
gce_flags
&
0x01
)
s
->
transparent_color_index
=
gce_transparent_index
;
else
...
...
@@ -184,7 +184,7 @@ static int gif_read_extension(GifState *s)
gce_flags
,
s
->
gce_delay
,
s
->
transparent_color_index
,
s
->
gce_disposal
);
ext_len
=
bytestream
_get_byte
(
&
s
->
bytestream
);
ext_len
=
bytestream
2_get_byte
(
&
s
->
gb
);
break
;
}
...
...
@@ -192,8 +192,8 @@ static int gif_read_extension(GifState *s)
discard_ext:
while
(
ext_len
!=
0
)
{
for
(
i
=
0
;
i
<
ext_len
;
i
++
)
bytestream
_get_byte
(
&
s
->
bytestream
);
ext_len
=
bytestream
_get_byte
(
&
s
->
bytestream
);
bytestream
2_get_byte
(
&
s
->
gb
);
ext_len
=
bytestream
2_get_byte
(
&
s
->
gb
);
av_dlog
(
s
->
avctx
,
"gif: ext_len1=%d
\n
"
,
ext_len
);
}
...
...
@@ -206,31 +206,31 @@ static int gif_read_header1(GifState *s)
int
v
,
n
;
int
has_global_palette
;
if
(
s
->
bytestream_end
<
s
->
bytestream
+
13
)
if
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
<
13
)
return
AVERROR_INVALIDDATA
;
/* read gif signature */
bytestream
_get_buffer
(
&
s
->
bytestream
,
sig
,
6
);
bytestream
2_get_buffer
(
&
s
->
gb
,
sig
,
6
);
if
(
memcmp
(
sig
,
gif87a_sig
,
6
)
!=
0
&&
memcmp
(
sig
,
gif89a_sig
,
6
)
!=
0
)
return
AVERROR_INVALIDDATA
;
/* read screen header */
s
->
transparent_color_index
=
-
1
;
s
->
screen_width
=
bytestream_get_le16
(
&
s
->
bytestream
);
s
->
screen_height
=
bytestream
_get_le16
(
&
s
->
bytestream
);
s
->
screen_width
=
bytestream2_get_le16
(
&
s
->
gb
);
s
->
screen_height
=
bytestream
2_get_le16
(
&
s
->
gb
);
if
(
(
unsigned
)
s
->
screen_width
>
32767
||
(
unsigned
)
s
->
screen_height
>
32767
){
av_log
(
NULL
,
AV_LOG_ERROR
,
"picture size too large
\n
"
);
return
AVERROR_INVALIDDATA
;
}
v
=
bytestream
_get_byte
(
&
s
->
bytestream
);
v
=
bytestream
2_get_byte
(
&
s
->
gb
);
s
->
color_resolution
=
((
v
&
0x70
)
>>
4
)
+
1
;
has_global_palette
=
(
v
&
0x80
);
s
->
bits_per_pixel
=
(
v
&
0x07
)
+
1
;
s
->
background_color_index
=
bytestream
_get_byte
(
&
s
->
bytestream
);
bytestream
_get_byte
(
&
s
->
bytestream
);
/* ignored */
s
->
background_color_index
=
bytestream
2_get_byte
(
&
s
->
gb
);
bytestream
2_get_byte
(
&
s
->
gb
);
/* ignored */
av_dlog
(
s
->
avctx
,
"gif: screen_w=%d screen_h=%d bpp=%d global_palette=%d
\n
"
,
s
->
screen_width
,
s
->
screen_height
,
s
->
bits_per_pixel
,
...
...
@@ -238,17 +238,17 @@ static int gif_read_header1(GifState *s)
if
(
has_global_palette
)
{
n
=
1
<<
s
->
bits_per_pixel
;
if
(
s
->
bytestream_end
<
s
->
bytestream
+
n
*
3
)
if
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
<
n
*
3
)
return
AVERROR_INVALIDDATA
;
bytestream
_get_buffer
(
&
s
->
bytestream
,
s
->
global_palette
,
n
*
3
);
bytestream
2_get_buffer
(
&
s
->
gb
,
s
->
global_palette
,
n
*
3
);
}
return
0
;
}
static
int
gif_parse_next_image
(
GifState
*
s
,
AVFrame
*
frame
)
{
while
(
s
->
bytestream
<
s
->
bytestream_end
)
{
int
code
=
bytestream
_get_byte
(
&
s
->
bytestream
);
while
(
bytestream2_get_bytes_left
(
&
s
->
gb
)
>
0
)
{
int
code
=
bytestream
2_get_byte
(
&
s
->
gb
);
int
ret
;
av_dlog
(
s
->
avctx
,
"gif: code=%02x '%c'
\n
"
,
code
,
code
);
...
...
@@ -289,8 +289,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
AVFrame
*
picture
=
data
;
int
ret
;
s
->
bytestream
=
buf
;
s
->
bytestream_end
=
buf
+
buf_size
;
bytestream2_init
(
&
s
->
gb
,
buf
,
buf_size
);
if
((
ret
=
gif_read_header1
(
s
))
<
0
)
return
ret
;
...
...
@@ -309,7 +308,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
return
ret
;
*
got_frame
=
1
;
return
s
->
bytestream
-
buf
;
return
bytestream2_tell
(
&
s
->
gb
)
;
}
static
av_cold
int
gif_decode_close
(
AVCodecContext
*
avctx
)
...
...
libavcodec/lzw.c
View file @
1f3e56b6
...
...
@@ -43,7 +43,7 @@ static const uint16_t mask[17] =
};
struct
LZWState
{
const
uint8_t
*
pbuf
,
*
ebuf
;
const
uint8_t
*
buf_start
,
*
pbuf
,
*
ebuf
;
int
bbits
;
unsigned
int
bbuf
;
...
...
@@ -92,9 +92,10 @@ static int lzw_get_code(struct LZWState * s)
return
c
&
s
->
curmask
;
}
const
uint8_t
*
ff_lzw_cur_ptr
(
LZWState
*
p
)
int
ff_lzw_size_read
(
LZWState
*
p
)
{
return
((
struct
LZWState
*
)
p
)
->
pbuf
;
struct
LZWState
*
s
=
p
;
return
s
->
pbuf
-
s
->
buf_start
;
}
void
ff_lzw_decode_tail
(
LZWState
*
p
)
...
...
libavcodec/lzw.h
View file @
1f3e56b6
...
...
@@ -47,7 +47,7 @@ void ff_lzw_decode_open(LZWState **p);
void
ff_lzw_decode_close
(
LZWState
**
p
);
int
ff_lzw_decode_init
(
LZWState
*
s
,
int
csize
,
const
uint8_t
*
buf
,
int
buf_size
,
int
mode
);
int
ff_lzw_decode
(
LZWState
*
s
,
uint8_t
*
buf
,
int
len
);
const
uint8_t
*
ff_lzw_cur_ptr
(
LZWState
*
lzw
);
int
ff_lzw_size_read
(
LZWState
*
lzw
);
void
ff_lzw_decode_tail
(
LZWState
*
lzw
);
/** LZW encode state */
...
...
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