qdrw.c
Go to the documentation of this file.
1 /*
2  * QuickDraw (qdrw) codec
3  * Copyright (c) 2004 Konstantin Shishkov
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  * Apple QuickDraw codec.
25  */
26 
27 #include "libavutil/common.h"
28 #include "libavutil/intreadwrite.h"
29 #include "avcodec.h"
30 #include "internal.h"
31 
32 static int decode_frame(AVCodecContext *avctx,
33  void *data, int *got_frame,
34  AVPacket *avpkt)
35 {
36  const uint8_t *buf = avpkt->data;
37  const uint8_t *buf_end = avpkt->data + avpkt->size;
38  int buf_size = avpkt->size;
39  AVFrame * const p = data;
40  uint8_t* outdata;
41  int colors;
42  int i, ret;
43  uint32_t *pal;
44  int r, g, b;
45 
46  if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
47  return ret;
49  p->key_frame = 1;
50 
51  outdata = p->data[0];
52 
53  if (buf_end - buf < 0x68 + 4)
54  return AVERROR_INVALIDDATA;
55  buf += 0x68; /* jump to palette */
56  colors = AV_RB32(buf);
57  buf += 4;
58 
59  if (colors < 0 || colors > 256) {
60  av_log(avctx, AV_LOG_ERROR, "Error color count - %i(0x%X)\n", colors, colors);
61  return AVERROR_INVALIDDATA;
62  }
63  if (buf_end - buf < (colors + 1) * 8)
64  return AVERROR_INVALIDDATA;
65 
66  pal = (uint32_t*)p->data[1];
67  for (i = 0; i <= colors; i++) {
68  unsigned int idx;
69  idx = AV_RB16(buf); /* color index */
70  buf += 2;
71 
72  if (idx > 255) {
73  av_log(avctx, AV_LOG_ERROR, "Palette index out of range: %u\n", idx);
74  buf += 6;
75  continue;
76  }
77  r = *buf++;
78  buf++;
79  g = *buf++;
80  buf++;
81  b = *buf++;
82  buf++;
83  pal[idx] = 0xFFU << 24 | r << 16 | g << 8 | b;
84  }
85  p->palette_has_changed = 1;
86 
87  if (buf_end - buf < 18)
88  return AVERROR_INVALIDDATA;
89  buf += 18; /* skip unneeded data */
90  for (i = 0; i < avctx->height; i++) {
91  int size, left, code, pix;
92  const uint8_t *next;
93  uint8_t *out;
94  int tsize = 0;
95 
96  /* decode line */
97  out = outdata;
98  size = AV_RB16(buf); /* size of packed line */
99  buf += 2;
100  if (buf_end - buf < size)
101  return AVERROR_INVALIDDATA;
102 
103  left = size;
104  next = buf + size;
105  while (left > 0) {
106  code = *buf++;
107  if (code & 0x80 ) { /* run */
108  pix = *buf++;
109  if ((out + (257 - code)) > (outdata + p->linesize[0]))
110  break;
111  memset(out, pix, 257 - code);
112  out += 257 - code;
113  tsize += 257 - code;
114  left -= 2;
115  } else { /* copy */
116  if ((out + code) > (outdata + p->linesize[0]))
117  break;
118  if (buf_end - buf < code + 1)
119  return AVERROR_INVALIDDATA;
120  memcpy(out, buf, code + 1);
121  out += code + 1;
122  buf += code + 1;
123  left -= 2 + code;
124  tsize += code + 1;
125  }
126  }
127  buf = next;
128  outdata += p->linesize[0];
129  }
130 
131  *got_frame = 1;
132 
133  return buf_size;
134 }
135 
137 {
138  avctx->pix_fmt= AV_PIX_FMT_PAL8;
139 
140  return 0;
141 }
142 
144  .name = "qdraw",
145  .type = AVMEDIA_TYPE_VIDEO,
146  .id = AV_CODEC_ID_QDRAW,
147  .init = decode_init,
148  .decode = decode_frame,
149  .capabilities = CODEC_CAP_DR1,
150  .long_name = NULL_IF_CONFIG_SMALL("Apple QuickDraw"),
151 };
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static av_cold int decode_init(AVCodecContext *avctx)
Definition: qdrw.c:136
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
uint8_t
#define av_cold
Definition: attributes.h:78
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
AVCodec ff_qdraw_decoder
Definition: qdrw.c:143
#define AV_RB32
#define b
Definition: input.c:42
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
#define U(x)
#define AV_RB16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
const char * r
Definition: vf_curves.c:94
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: qdrw.c:32
external API header
int size
FFT buffer for g
Definition: stft_peak.m:17
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
ret
Definition: avfilter.c:821
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
synthesis window for stochastic i
int palette_has_changed
Tell user application that palette has changed from previous frame.
Definition: frame.h:280
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
common internal api header.
common internal and external API header
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
This structure stores compressed data.
for(j=16;j >0;--j)