FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
aasc.c
Go to the documentation of this file.
1
/*
2
* Autodesk RLE Decoder
3
* Copyright (C) 2005 the ffmpeg project
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
/**
23
* @file
24
* Autodesk RLE Video Decoder by Konstantin Shishkov
25
*/
26
27
#include <stdio.h>
28
#include <stdlib.h>
29
#include <string.h>
30
31
#include "
avcodec.h
"
32
#include "
internal.h
"
33
#include "
msrledec.h
"
34
35
typedef
struct
AascContext
{
36
AVCodecContext
*
avctx
;
37
GetByteContext
gb
;
38
AVFrame
*
frame
;
39
40
uint32_t
palette
[
AVPALETTE_COUNT
];
41
int
palette_size
;
42
}
AascContext
;
43
44
static
av_cold
int
aasc_decode_init
(
AVCodecContext
*avctx)
45
{
46
AascContext
*
s
= avctx->
priv_data
;
47
uint8_t
*ptr;
48
int
i;
49
50
s->
avctx
= avctx;
51
switch
(avctx->
bits_per_coded_sample
) {
52
case
8:
53
avctx->
pix_fmt
=
AV_PIX_FMT_PAL8
;
54
55
ptr = avctx->
extradata
;
56
s->
palette_size
=
FFMIN
(avctx->
extradata_size
,
AVPALETTE_SIZE
);
57
for
(i = 0; i < s->
palette_size
/ 4; i++) {
58
s->
palette
[i] = 0xFF
U
<< 24 |
AV_RL32
(ptr);
59
ptr += 4;
60
}
61
break
;
62
case
16:
63
avctx->
pix_fmt
=
AV_PIX_FMT_RGB555LE
;
64
break
;
65
case
24:
66
avctx->
pix_fmt
=
AV_PIX_FMT_BGR24
;
67
break
;
68
default
:
69
av_log
(avctx,
AV_LOG_ERROR
,
"Unsupported bit depth: %d\n"
, avctx->
bits_per_coded_sample
);
70
return
-1;
71
}
72
73
s->
frame
=
av_frame_alloc
();
74
if
(!s->
frame
)
75
return
AVERROR
(ENOMEM);
76
77
return
0;
78
}
79
80
static
int
aasc_decode_frame
(
AVCodecContext
*avctx,
81
void
*
data
,
int
*got_frame,
82
AVPacket
*avpkt)
83
{
84
const
uint8_t
*
buf
= avpkt->
data
;
85
int
buf_size = avpkt->
size
;
86
AascContext
*
s
= avctx->
priv_data
;
87
int
compr, i,
stride
, psize,
ret
;
88
89
if
(buf_size < 4) {
90
av_log
(avctx,
AV_LOG_ERROR
,
"frame too short\n"
);
91
return
AVERROR_INVALIDDATA
;
92
}
93
94
if
((ret =
ff_reget_buffer
(avctx, s->
frame
)) < 0)
95
return
ret
;
96
97
compr =
AV_RL32
(buf);
98
buf += 4;
99
buf_size -= 4;
100
psize = avctx->
bits_per_coded_sample
/ 8;
101
switch
(avctx->
codec_tag
) {
102
case
MKTAG
(
'A'
,
'A'
,
'S'
,
'4'
):
103
bytestream2_init
(&s->
gb
, buf - 4, buf_size + 4);
104
ff_msrle_decode
(avctx, (
AVPicture
*)s->
frame
, 8, &s->
gb
);
105
break
;
106
case
MKTAG
(
'A'
,
'A'
,
'S'
,
'C'
):
107
switch
(compr) {
108
case
0:
109
stride = (avctx->
width
* psize + psize) & ~psize;
110
if
(buf_size < stride * avctx->
height
)
111
return
AVERROR_INVALIDDATA
;
112
for
(i = avctx->
height
- 1; i >= 0; i--) {
113
memcpy(s->
frame
->
data
[0] + i * s->
frame
->
linesize
[0], buf, avctx->
width
* psize);
114
buf += stride;
115
buf_size -= stride;
116
}
117
break
;
118
case
1:
119
bytestream2_init
(&s->
gb
, buf, buf_size);
120
ff_msrle_decode
(avctx, (
AVPicture
*)s->
frame
, 8, &s->
gb
);
121
break
;
122
default
:
123
av_log
(avctx,
AV_LOG_ERROR
,
"Unknown compression type %d\n"
, compr);
124
return
AVERROR_INVALIDDATA
;
125
}
126
break
;
127
default
:
128
av_log
(avctx,
AV_LOG_ERROR
,
"Unknown FourCC: %X\n"
, avctx->
codec_tag
);
129
return
-1;
130
}
131
132
if
(avctx->
pix_fmt
==
AV_PIX_FMT_PAL8
)
133
memcpy(s->
frame
->
data
[1], s->
palette
, s->
palette_size
);
134
135
*got_frame = 1;
136
if
((ret =
av_frame_ref
(data, s->
frame
)) < 0)
137
return
ret
;
138
139
/* report that the buffer was completely consumed */
140
return
buf_size;
141
}
142
143
static
av_cold
int
aasc_decode_end
(
AVCodecContext
*avctx)
144
{
145
AascContext
*
s
= avctx->
priv_data
;
146
147
av_frame_free
(&s->
frame
);
148
149
return
0;
150
}
151
152
AVCodec
ff_aasc_decoder
= {
153
.
name
=
"aasc"
,
154
.long_name =
NULL_IF_CONFIG_SMALL
(
"Autodesk RLE"
),
155
.type =
AVMEDIA_TYPE_VIDEO
,
156
.id =
AV_CODEC_ID_AASC
,
157
.priv_data_size =
sizeof
(
AascContext
),
158
.
init
=
aasc_decode_init
,
159
.
close
=
aasc_decode_end
,
160
.
decode
=
aasc_decode_frame
,
161
.capabilities =
CODEC_CAP_DR1
,
162
};
Generated on Sun Mar 23 2014 23:49:50 for FFmpeg by
1.8.2