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
1f3e56b6
Commit
1f3e56b6
authored
11 years ago
by
Anton Khirnov
Browse files
Options
Downloads
Patches
Plain Diff
gifdec: convert to bytestream2
parent
c453723a
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
libavcodec/gifdec.c
+33
-34
33 additions, 34 deletions
libavcodec/gifdec.c
libavcodec/lzw.c
+4
-3
4 additions, 3 deletions
libavcodec/lzw.c
libavcodec/lzw.h
+1
-1
1 addition, 1 deletion
libavcodec/lzw.h
with
38 additions
and
38 deletions
libavcodec/gifdec.c
+
33
−
34
View file @
1f3e56b6
...
@@ -46,8 +46,7 @@ typedef struct GifState {
...
@@ -46,8 +46,7 @@ typedef struct GifState {
int
gce_delay
;
int
gce_delay
;
/* LZW compatible decoder */
/* LZW compatible decoder */
const
uint8_t
*
bytestream
;
GetByteContext
gb
;
const
uint8_t
*
bytestream_end
;
LZWState
*
lzw
;
LZWState
*
lzw
;
/* aux buffers */
/* aux buffers */
...
@@ -66,11 +65,11 @@ static int gif_read_image(GifState *s, AVFrame *frame)
...
@@ -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
;
int
is_interleaved
,
has_local_palette
,
y
,
pass
,
y1
,
linesize
,
n
,
i
;
uint8_t
*
ptr
,
*
spal
,
*
palette
,
*
ptr1
;
uint8_t
*
ptr
,
*
spal
,
*
palette
,
*
ptr1
;
left
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
left
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
top
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
top
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
width
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
width
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
height
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
height
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
flags
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
flags
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
is_interleaved
=
flags
&
0x40
;
is_interleaved
=
flags
&
0x40
;
has_local_palette
=
flags
&
0x80
;
has_local_palette
=
flags
&
0x80
;
bits_per_pixel
=
(
flags
&
0x07
)
+
1
;
bits_per_pixel
=
(
flags
&
0x07
)
+
1
;
...
@@ -78,7 +77,7 @@ static int gif_read_image(GifState *s, AVFrame *frame)
...
@@ -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
);
av_dlog
(
s
->
avctx
,
"gif: image x=%d y=%d w=%d h=%d
\n
"
,
left
,
top
,
width
,
height
);
if
(
has_local_palette
)
{
if
(
has_local_palette
)
{
bytestream_get_buffer
(
&
s
->
b
ytestream
,
s
->
local_palette
,
3
*
(
1
<<
bits_per_pixel
));
bytestream
2
_get_buffer
(
&
s
->
g
b
,
s
->
local_palette
,
3
*
(
1
<<
bits_per_pixel
));
palette
=
s
->
local_palette
;
palette
=
s
->
local_palette
;
}
else
{
}
else
{
palette
=
s
->
global_palette
;
palette
=
s
->
global_palette
;
...
@@ -107,9 +106,9 @@ static int gif_read_image(GifState *s, AVFrame *frame)
...
@@ -107,9 +106,9 @@ static int gif_read_image(GifState *s, AVFrame *frame)
s
->
image_palette
[
s
->
transparent_color_index
]
=
0
;
s
->
image_palette
[
s
->
transparent_color_index
]
=
0
;
/* now get the image data */
/* now get the image data */
code_size
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
code_size
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
ff_lzw_decode_init
(
s
->
lzw
,
code_size
,
s
->
bytestream
,
ff_lzw_decode_init
(
s
->
lzw
,
code_size
,
s
->
gb
.
buffer
,
s
->
bytestream
_end
-
s
->
bytestream
,
FF_LZW_GIF
);
bytestream
2_get_bytes_left
(
&
s
->
gb
)
,
FF_LZW_GIF
);
/* read all the image */
/* read all the image */
linesize
=
frame
->
linesize
[
0
];
linesize
=
frame
->
linesize
[
0
];
...
@@ -152,7 +151,8 @@ static int gif_read_image(GifState *s, AVFrame *frame)
...
@@ -152,7 +151,8 @@ static int gif_read_image(GifState *s, AVFrame *frame)
}
}
/* read the garbage data until end marker is found */
/* read the garbage data until end marker is found */
ff_lzw_decode_tail
(
s
->
lzw
);
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
;
return
0
;
}
}
...
@@ -161,8 +161,8 @@ static int gif_read_extension(GifState *s)
...
@@ -161,8 +161,8 @@ static int gif_read_extension(GifState *s)
int
ext_code
,
ext_len
,
i
,
gce_flags
,
gce_transparent_index
;
int
ext_code
,
ext_len
,
i
,
gce_flags
,
gce_transparent_index
;
/* extension */
/* extension */
ext_code
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
ext_code
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
ext_len
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
ext_len
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
av_dlog
(
s
->
avctx
,
"gif: ext_code=0x%x len=%d
\n
"
,
ext_code
,
ext_len
);
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)
...
@@ -171,9 +171,9 @@ static int gif_read_extension(GifState *s)
if
(
ext_len
!=
4
)
if
(
ext_len
!=
4
)
goto
discard_ext
;
goto
discard_ext
;
s
->
transparent_color_index
=
-
1
;
s
->
transparent_color_index
=
-
1
;
gce_flags
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
gce_flags
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
s
->
gce_delay
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
s
->
gce_delay
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
gce_transparent_index
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
gce_transparent_index
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
if
(
gce_flags
&
0x01
)
if
(
gce_flags
&
0x01
)
s
->
transparent_color_index
=
gce_transparent_index
;
s
->
transparent_color_index
=
gce_transparent_index
;
else
else
...
@@ -184,7 +184,7 @@ static int gif_read_extension(GifState *s)
...
@@ -184,7 +184,7 @@ static int gif_read_extension(GifState *s)
gce_flags
,
s
->
gce_delay
,
gce_flags
,
s
->
gce_delay
,
s
->
transparent_color_index
,
s
->
gce_disposal
);
s
->
transparent_color_index
,
s
->
gce_disposal
);
ext_len
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
ext_len
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
break
;
break
;
}
}
...
@@ -192,8 +192,8 @@ static int gif_read_extension(GifState *s)
...
@@ -192,8 +192,8 @@ static int gif_read_extension(GifState *s)
discard_ext:
discard_ext:
while
(
ext_len
!=
0
)
{
while
(
ext_len
!=
0
)
{
for
(
i
=
0
;
i
<
ext_len
;
i
++
)
for
(
i
=
0
;
i
<
ext_len
;
i
++
)
bytestream_get_byte
(
&
s
->
b
ytestream
);
bytestream
2
_get_byte
(
&
s
->
g
b
);
ext_len
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
ext_len
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
av_dlog
(
s
->
avctx
,
"gif: ext_len1=%d
\n
"
,
ext_len
);
av_dlog
(
s
->
avctx
,
"gif: ext_len1=%d
\n
"
,
ext_len
);
}
}
...
@@ -206,31 +206,31 @@ static int gif_read_header1(GifState *s)
...
@@ -206,31 +206,31 @@ static int gif_read_header1(GifState *s)
int
v
,
n
;
int
v
,
n
;
int
has_global_palette
;
int
has_global_palette
;
if
(
s
->
bytestream
_end
<
s
->
bytestream
+
13
)
if
(
bytestream
2_get_bytes_left
(
&
s
->
gb
)
<
13
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
/* read gif signature */
/* read gif signature */
bytestream_get_buffer
(
&
s
->
b
ytestream
,
sig
,
6
);
bytestream
2
_get_buffer
(
&
s
->
g
b
,
sig
,
6
);
if
(
memcmp
(
sig
,
gif87a_sig
,
6
)
!=
0
&&
if
(
memcmp
(
sig
,
gif87a_sig
,
6
)
!=
0
&&
memcmp
(
sig
,
gif89a_sig
,
6
)
!=
0
)
memcmp
(
sig
,
gif89a_sig
,
6
)
!=
0
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
/* read screen header */
/* read screen header */
s
->
transparent_color_index
=
-
1
;
s
->
transparent_color_index
=
-
1
;
s
->
screen_width
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
s
->
screen_width
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
s
->
screen_height
=
bytestream_get_le16
(
&
s
->
b
ytestream
);
s
->
screen_height
=
bytestream
2
_get_le16
(
&
s
->
g
b
);
if
(
(
unsigned
)
s
->
screen_width
>
32767
if
(
(
unsigned
)
s
->
screen_width
>
32767
||
(
unsigned
)
s
->
screen_height
>
32767
){
||
(
unsigned
)
s
->
screen_height
>
32767
){
av_log
(
NULL
,
AV_LOG_ERROR
,
"picture size too large
\n
"
);
av_log
(
NULL
,
AV_LOG_ERROR
,
"picture size too large
\n
"
);
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
v
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
v
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
s
->
color_resolution
=
((
v
&
0x70
)
>>
4
)
+
1
;
s
->
color_resolution
=
((
v
&
0x70
)
>>
4
)
+
1
;
has_global_palette
=
(
v
&
0x80
);
has_global_palette
=
(
v
&
0x80
);
s
->
bits_per_pixel
=
(
v
&
0x07
)
+
1
;
s
->
bits_per_pixel
=
(
v
&
0x07
)
+
1
;
s
->
background_color_index
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
s
->
background_color_index
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
bytestream_get_byte
(
&
s
->
b
ytestream
);
/* ignored */
bytestream
2
_get_byte
(
&
s
->
g
b
);
/* ignored */
av_dlog
(
s
->
avctx
,
"gif: screen_w=%d screen_h=%d bpp=%d global_palette=%d
\n
"
,
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
,
s
->
screen_width
,
s
->
screen_height
,
s
->
bits_per_pixel
,
...
@@ -238,17 +238,17 @@ static int gif_read_header1(GifState *s)
...
@@ -238,17 +238,17 @@ static int gif_read_header1(GifState *s)
if
(
has_global_palette
)
{
if
(
has_global_palette
)
{
n
=
1
<<
s
->
bits_per_pixel
;
n
=
1
<<
s
->
bits_per_pixel
;
if
(
s
->
bytestream
_end
<
s
->
bytestream
+
n
*
3
)
if
(
bytestream
2_get_bytes_left
(
&
s
->
gb
)
<
n
*
3
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
bytestream_get_buffer
(
&
s
->
b
ytestream
,
s
->
global_palette
,
n
*
3
);
bytestream
2
_get_buffer
(
&
s
->
g
b
,
s
->
global_palette
,
n
*
3
);
}
}
return
0
;
return
0
;
}
}
static
int
gif_parse_next_image
(
GifState
*
s
,
AVFrame
*
frame
)
static
int
gif_parse_next_image
(
GifState
*
s
,
AVFrame
*
frame
)
{
{
while
(
s
->
bytestream
<
s
->
bytestream_end
)
{
while
(
bytestream
2_get_bytes_left
(
&
s
->
gb
)
>
0
)
{
int
code
=
bytestream_get_byte
(
&
s
->
b
ytestream
);
int
code
=
bytestream
2
_get_byte
(
&
s
->
g
b
);
int
ret
;
int
ret
;
av_dlog
(
s
->
avctx
,
"gif: code=%02x '%c'
\n
"
,
code
,
code
);
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,
...
@@ -289,8 +289,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
AVFrame
*
picture
=
data
;
AVFrame
*
picture
=
data
;
int
ret
;
int
ret
;
s
->
bytestream
=
buf
;
bytestream2_init
(
&
s
->
gb
,
buf
,
buf_size
);
s
->
bytestream_end
=
buf
+
buf_size
;
if
((
ret
=
gif_read_header1
(
s
))
<
0
)
if
((
ret
=
gif_read_header1
(
s
))
<
0
)
return
ret
;
return
ret
;
...
@@ -309,7 +308,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
...
@@ -309,7 +308,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
return
ret
;
return
ret
;
*
got_frame
=
1
;
*
got_frame
=
1
;
return
s
->
bytestream
-
buf
;
return
bytestream
2_tell
(
&
s
->
gb
)
;
}
}
static
av_cold
int
gif_decode_close
(
AVCodecContext
*
avctx
)
static
av_cold
int
gif_decode_close
(
AVCodecContext
*
avctx
)
...
...
This diff is collapsed.
Click to expand it.
libavcodec/lzw.c
+
4
−
3
View file @
1f3e56b6
...
@@ -43,7 +43,7 @@ static const uint16_t mask[17] =
...
@@ -43,7 +43,7 @@ static const uint16_t mask[17] =
};
};
struct
LZWState
{
struct
LZWState
{
const
uint8_t
*
pbuf
,
*
ebuf
;
const
uint8_t
*
buf_start
,
*
pbuf
,
*
ebuf
;
int
bbits
;
int
bbits
;
unsigned
int
bbuf
;
unsigned
int
bbuf
;
...
@@ -92,9 +92,10 @@ static int lzw_get_code(struct LZWState * s)
...
@@ -92,9 +92,10 @@ static int lzw_get_code(struct LZWState * s)
return
c
&
s
->
curmask
;
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
)
void
ff_lzw_decode_tail
(
LZWState
*
p
)
...
...
This diff is collapsed.
Click to expand it.
libavcodec/lzw.h
+
1
−
1
View file @
1f3e56b6
...
@@ -47,7 +47,7 @@ void ff_lzw_decode_open(LZWState **p);
...
@@ -47,7 +47,7 @@ void ff_lzw_decode_open(LZWState **p);
void
ff_lzw_decode_close
(
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_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
);
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
);
void
ff_lzw_decode_tail
(
LZWState
*
lzw
);
/** LZW encode state */
/** LZW encode state */
...
...
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