FFmpeg
Loading...
Searching...
No Matches
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 <string.h>
28
29#include "avcodec.h"
30#include "codec_internal.h"
31#include "decode.h"
32#include "msrledec.h"
33
42
44{
45 AascContext *s = avctx->priv_data;
46 uint8_t *ptr;
47 int i;
48
49 s->avctx = avctx;
50 switch (avctx->bits_per_coded_sample) {
51 case 8:
52 avctx->pix_fmt = AV_PIX_FMT_PAL8;
53
54 ptr = avctx->extradata;
55 s->palette_size = FFMIN(avctx->extradata_size, AVPALETTE_SIZE);
56 for (i = 0; i < s->palette_size / 4; i++) {
57 s->palette[i] = 0xFFU << 24 | AV_RL32(ptr);
58 ptr += 4;
59 }
60 break;
61 case 16:
63 break;
64 case 24:
66 break;
67 default:
68 av_log(avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n", avctx->bits_per_coded_sample);
69 return -1;
70 }
71
72 s->frame = av_frame_alloc();
73 if (!s->frame)
74 return AVERROR(ENOMEM);
75
76 return 0;
77}
78
79static int aasc_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
80 int *got_frame, AVPacket *avpkt)
81{
82 const uint8_t *buf = avpkt->data;
83 int buf_size = avpkt->size;
84 AascContext *s = avctx->priv_data;
85 int compr, i, stride, psize, ret;
86
87 if (buf_size < 4) {
88 av_log(avctx, AV_LOG_ERROR, "frame too short\n");
90 }
91
92 if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
93 return ret;
94
95 compr = AV_RL32(buf);
96 buf += 4;
97 buf_size -= 4;
98 psize = avctx->bits_per_coded_sample / 8;
99 switch (avctx->codec_tag) {
100 case MKTAG('A', 'A', 'S', '4'):
101 bytestream2_init(&s->gb, buf - 4, buf_size + 4);
102 ff_msrle_decode(avctx, s->frame, 8, &s->gb);
103 break;
104 case MKTAG('A', 'A', 'S', 'C'):
105 switch (compr) {
106 case 0:
107 stride = (avctx->width * psize + psize) & ~psize;
108 if (buf_size < stride * avctx->height)
109 return AVERROR_INVALIDDATA;
110 for (i = avctx->height - 1; i >= 0; i--) {
111 memcpy(s->frame->data[0] + i * s->frame->linesize[0], buf, avctx->width * psize);
112 buf += stride;
113 buf_size -= stride;
114 }
115 break;
116 case 1:
117 bytestream2_init(&s->gb, buf, buf_size);
118 ff_msrle_decode(avctx, s->frame, 8, &s->gb);
119 break;
120 default:
121 av_log(avctx, AV_LOG_ERROR, "Unknown compression type %d\n", compr);
122 return AVERROR_INVALIDDATA;
123 }
124 break;
125 default:
126 av_log(avctx, AV_LOG_ERROR, "Unknown FourCC: %X\n", avctx->codec_tag);
127 return -1;
128 }
129
130 if (avctx->pix_fmt == AV_PIX_FMT_PAL8)
131 memcpy(s->frame->data[1], s->palette, s->palette_size);
132
133 *got_frame = 1;
134 if ((ret = av_frame_ref(rframe, s->frame)) < 0)
135 return ret;
136
137 /* report that the buffer was completely consumed */
138 return avpkt->size;
139}
140
142{
143 AascContext *s = avctx->priv_data;
144
145 av_frame_free(&s->frame);
146
147 return 0;
148}
149
151 .p.name = "aasc",
152 CODEC_LONG_NAME("Autodesk RLE"),
153 .p.type = AVMEDIA_TYPE_VIDEO,
154 .p.id = AV_CODEC_ID_AASC,
155 .priv_data_size = sizeof(AascContext),
159 .p.capabilities = AV_CODEC_CAP_DR1,
160};
static av_cold int aasc_decode_init(AVCodecContext *avctx)
Definition aasc.c:43
static av_cold int aasc_decode_end(AVCodecContext *avctx)
Definition aasc.c:141
static int aasc_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
Definition aasc.c:79
const FFCodec ff_aasc_decoder
Definition aasc.c:150
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
Libavcodec external API header.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
Definition decode.c:1906
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AV_CODEC_ID_AASC
Definition codec_id.h:124
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_RL32(p)
#define av_cold
Definition attributes.h:117
#define FFMIN(a, b)
Definition macros.h:49
#define MKTAG(a, b, c, d)
Definition macros.h:55
int ff_msrle_decode(AVCodecContext *avctx, AVFrame *pic, int depth, GetByteContext *gb)
Decode stream in MS RLE format into frame.
Definition msrledec.c:249
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:115
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition pixfmt.h:84
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
#define AVPALETTE_COUNT
Definition pixfmt.h:33
#define AVPALETTE_SIZE
Definition pixfmt.h:32
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition avcodec.h:468
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition avcodec.h:1564
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int extradata_size
Definition avcodec.h:527
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
AVCodecContext * avctx
Definition aasc.c:35
AVFrame * frame
Definition aasc.c:37
GetByteContext gb
Definition aasc.c:36
uint32_t palette[AVPALETTE_COUNT]
Definition aasc.c:39
int palette_size
Definition aasc.c:40
#define stride
#define av_log(a,...)
#define height
Definition dsp.h:89