annotate ffmpeg/libavcodec/pnmdec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * PNM image format
yading@10 3 * Copyright (c) 2002, 2003 Fabrice Bellard
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "avcodec.h"
yading@10 23 #include "internal.h"
yading@10 24 #include "put_bits.h"
yading@10 25 #include "pnm.h"
yading@10 26
yading@10 27
yading@10 28 static int pnm_decode_frame(AVCodecContext *avctx, void *data,
yading@10 29 int *got_frame, AVPacket *avpkt)
yading@10 30 {
yading@10 31 const uint8_t *buf = avpkt->data;
yading@10 32 int buf_size = avpkt->size;
yading@10 33 PNMContext * const s = avctx->priv_data;
yading@10 34 AVFrame * const p = data;
yading@10 35 int i, j, n, linesize, h, upgrade = 0, is_mono = 0;
yading@10 36 unsigned char *ptr;
yading@10 37 int components, sample_len, ret;
yading@10 38
yading@10 39 s->bytestream_start =
yading@10 40 s->bytestream = (uint8_t *)buf;
yading@10 41 s->bytestream_end = (uint8_t *)buf + buf_size;
yading@10 42
yading@10 43 if ((ret = ff_pnm_decode_header(avctx, s)) < 0)
yading@10 44 return ret;
yading@10 45
yading@10 46 if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
yading@10 47 return ret;
yading@10 48 p->pict_type = AV_PICTURE_TYPE_I;
yading@10 49 p->key_frame = 1;
yading@10 50
yading@10 51 switch (avctx->pix_fmt) {
yading@10 52 default:
yading@10 53 return AVERROR(EINVAL);
yading@10 54 case AV_PIX_FMT_RGBA64BE:
yading@10 55 n = avctx->width * 8;
yading@10 56 components=4;
yading@10 57 sample_len=16;
yading@10 58 goto do_read;
yading@10 59 case AV_PIX_FMT_RGB48BE:
yading@10 60 n = avctx->width * 6;
yading@10 61 components=3;
yading@10 62 sample_len=16;
yading@10 63 goto do_read;
yading@10 64 case AV_PIX_FMT_RGBA:
yading@10 65 n = avctx->width * 4;
yading@10 66 components=4;
yading@10 67 sample_len=8;
yading@10 68 goto do_read;
yading@10 69 case AV_PIX_FMT_RGB24:
yading@10 70 n = avctx->width * 3;
yading@10 71 components=3;
yading@10 72 sample_len=8;
yading@10 73 goto do_read;
yading@10 74 case AV_PIX_FMT_GRAY8:
yading@10 75 n = avctx->width;
yading@10 76 components=1;
yading@10 77 sample_len=8;
yading@10 78 if (s->maxval < 255)
yading@10 79 upgrade = 1;
yading@10 80 goto do_read;
yading@10 81 case AV_PIX_FMT_GRAY8A:
yading@10 82 n = avctx->width * 2;
yading@10 83 components=2;
yading@10 84 sample_len=8;
yading@10 85 goto do_read;
yading@10 86 case AV_PIX_FMT_GRAY16BE:
yading@10 87 case AV_PIX_FMT_GRAY16LE:
yading@10 88 n = avctx->width * 2;
yading@10 89 components=1;
yading@10 90 sample_len=16;
yading@10 91 if (s->maxval < 65535)
yading@10 92 upgrade = 2;
yading@10 93 goto do_read;
yading@10 94 case AV_PIX_FMT_MONOWHITE:
yading@10 95 case AV_PIX_FMT_MONOBLACK:
yading@10 96 n = (avctx->width + 7) >> 3;
yading@10 97 components=1;
yading@10 98 sample_len=1;
yading@10 99 is_mono = 1;
yading@10 100 do_read:
yading@10 101 ptr = p->data[0];
yading@10 102 linesize = p->linesize[0];
yading@10 103 if (s->bytestream + n * avctx->height > s->bytestream_end)
yading@10 104 return AVERROR_INVALIDDATA;
yading@10 105 if(s->type < 4 || (is_mono && s->type==7)){
yading@10 106 for (i=0; i<avctx->height; i++) {
yading@10 107 PutBitContext pb;
yading@10 108 init_put_bits(&pb, ptr, linesize);
yading@10 109 for(j=0; j<avctx->width * components; j++){
yading@10 110 unsigned int c=0;
yading@10 111 int v=0;
yading@10 112 if(s->type < 4)
yading@10 113 while(s->bytestream < s->bytestream_end && (*s->bytestream < '0' || *s->bytestream > '9' ))
yading@10 114 s->bytestream++;
yading@10 115 if(s->bytestream >= s->bytestream_end)
yading@10 116 return AVERROR_INVALIDDATA;
yading@10 117 if (is_mono) {
yading@10 118 /* read a single digit */
yading@10 119 v = (*s->bytestream++)&1;
yading@10 120 } else {
yading@10 121 /* read a sequence of digits */
yading@10 122 do {
yading@10 123 v = 10*v + c;
yading@10 124 c = (*s->bytestream++) - '0';
yading@10 125 } while (c <= 9);
yading@10 126 }
yading@10 127 put_bits(&pb, sample_len, (((1<<sample_len)-1)*v + (s->maxval>>1))/s->maxval);
yading@10 128 }
yading@10 129 flush_put_bits(&pb);
yading@10 130 ptr+= linesize;
yading@10 131 }
yading@10 132 }else{
yading@10 133 for (i = 0; i < avctx->height; i++) {
yading@10 134 if (!upgrade)
yading@10 135 memcpy(ptr, s->bytestream, n);
yading@10 136 else if (upgrade == 1) {
yading@10 137 unsigned int j, f = (255 * 128 + s->maxval / 2) / s->maxval;
yading@10 138 for (j = 0; j < n; j++)
yading@10 139 ptr[j] = (s->bytestream[j] * f + 64) >> 7;
yading@10 140 } else if (upgrade == 2) {
yading@10 141 unsigned int j, v, f = (65535 * 32768 + s->maxval / 2) / s->maxval;
yading@10 142 for (j = 0; j < n / 2; j++) {
yading@10 143 v = av_be2ne16(((uint16_t *)s->bytestream)[j]);
yading@10 144 ((uint16_t *)ptr)[j] = (v * f + 16384) >> 15;
yading@10 145 }
yading@10 146 }
yading@10 147 s->bytestream += n;
yading@10 148 ptr += linesize;
yading@10 149 }
yading@10 150 }
yading@10 151 break;
yading@10 152 case AV_PIX_FMT_YUV420P:
yading@10 153 case AV_PIX_FMT_YUV420P9BE:
yading@10 154 case AV_PIX_FMT_YUV420P10BE:
yading@10 155 {
yading@10 156 unsigned char *ptr1, *ptr2;
yading@10 157
yading@10 158 n = avctx->width;
yading@10 159 ptr = p->data[0];
yading@10 160 linesize = p->linesize[0];
yading@10 161 if (s->maxval >= 256)
yading@10 162 n *= 2;
yading@10 163 if (s->bytestream + n * avctx->height * 3 / 2 > s->bytestream_end)
yading@10 164 return AVERROR_INVALIDDATA;
yading@10 165 for (i = 0; i < avctx->height; i++) {
yading@10 166 memcpy(ptr, s->bytestream, n);
yading@10 167 s->bytestream += n;
yading@10 168 ptr += linesize;
yading@10 169 }
yading@10 170 ptr1 = p->data[1];
yading@10 171 ptr2 = p->data[2];
yading@10 172 n >>= 1;
yading@10 173 h = avctx->height >> 1;
yading@10 174 for (i = 0; i < h; i++) {
yading@10 175 memcpy(ptr1, s->bytestream, n);
yading@10 176 s->bytestream += n;
yading@10 177 memcpy(ptr2, s->bytestream, n);
yading@10 178 s->bytestream += n;
yading@10 179 ptr1 += p->linesize[1];
yading@10 180 ptr2 += p->linesize[2];
yading@10 181 }
yading@10 182 }
yading@10 183 break;
yading@10 184 case AV_PIX_FMT_YUV420P16:
yading@10 185 {
yading@10 186 uint16_t *ptr1, *ptr2;
yading@10 187 const int f = (65535 * 32768 + s->maxval / 2) / s->maxval;
yading@10 188 unsigned int j, v;
yading@10 189
yading@10 190 n = avctx->width * 2;
yading@10 191 ptr = p->data[0];
yading@10 192 linesize = p->linesize[0];
yading@10 193 if (s->bytestream + n * avctx->height * 3 / 2 > s->bytestream_end)
yading@10 194 return AVERROR_INVALIDDATA;
yading@10 195 for (i = 0; i < avctx->height; i++) {
yading@10 196 for (j = 0; j < n / 2; j++) {
yading@10 197 v = av_be2ne16(((uint16_t *)s->bytestream)[j]);
yading@10 198 ((uint16_t *)ptr)[j] = (v * f + 16384) >> 15;
yading@10 199 }
yading@10 200 s->bytestream += n;
yading@10 201 ptr += linesize;
yading@10 202 }
yading@10 203 ptr1 = (uint16_t*)p->data[1];
yading@10 204 ptr2 = (uint16_t*)p->data[2];
yading@10 205 n >>= 1;
yading@10 206 h = avctx->height >> 1;
yading@10 207 for (i = 0; i < h; i++) {
yading@10 208 for (j = 0; j < n / 2; j++) {
yading@10 209 v = av_be2ne16(((uint16_t *)s->bytestream)[j]);
yading@10 210 ptr1[j] = (v * f + 16384) >> 15;
yading@10 211 }
yading@10 212 s->bytestream += n;
yading@10 213
yading@10 214 for (j = 0; j < n / 2; j++) {
yading@10 215 v = av_be2ne16(((uint16_t *)s->bytestream)[j]);
yading@10 216 ptr2[j] = (v * f + 16384) >> 15;
yading@10 217 }
yading@10 218 s->bytestream += n;
yading@10 219
yading@10 220 ptr1 += p->linesize[1] / 2;
yading@10 221 ptr2 += p->linesize[2] / 2;
yading@10 222 }
yading@10 223 }
yading@10 224 break;
yading@10 225 }
yading@10 226 *got_frame = 1;
yading@10 227
yading@10 228 return s->bytestream - s->bytestream_start;
yading@10 229 }
yading@10 230
yading@10 231
yading@10 232 #if CONFIG_PGM_DECODER
yading@10 233 AVCodec ff_pgm_decoder = {
yading@10 234 .name = "pgm",
yading@10 235 .type = AVMEDIA_TYPE_VIDEO,
yading@10 236 .id = AV_CODEC_ID_PGM,
yading@10 237 .priv_data_size = sizeof(PNMContext),
yading@10 238 .decode = pnm_decode_frame,
yading@10 239 .capabilities = CODEC_CAP_DR1,
yading@10 240 .long_name = NULL_IF_CONFIG_SMALL("PGM (Portable GrayMap) image"),
yading@10 241 };
yading@10 242 #endif
yading@10 243
yading@10 244 #if CONFIG_PGMYUV_DECODER
yading@10 245 AVCodec ff_pgmyuv_decoder = {
yading@10 246 .name = "pgmyuv",
yading@10 247 .type = AVMEDIA_TYPE_VIDEO,
yading@10 248 .id = AV_CODEC_ID_PGMYUV,
yading@10 249 .priv_data_size = sizeof(PNMContext),
yading@10 250 .decode = pnm_decode_frame,
yading@10 251 .capabilities = CODEC_CAP_DR1,
yading@10 252 .long_name = NULL_IF_CONFIG_SMALL("PGMYUV (Portable GrayMap YUV) image"),
yading@10 253 };
yading@10 254 #endif
yading@10 255
yading@10 256 #if CONFIG_PPM_DECODER
yading@10 257 AVCodec ff_ppm_decoder = {
yading@10 258 .name = "ppm",
yading@10 259 .type = AVMEDIA_TYPE_VIDEO,
yading@10 260 .id = AV_CODEC_ID_PPM,
yading@10 261 .priv_data_size = sizeof(PNMContext),
yading@10 262 .decode = pnm_decode_frame,
yading@10 263 .capabilities = CODEC_CAP_DR1,
yading@10 264 .long_name = NULL_IF_CONFIG_SMALL("PPM (Portable PixelMap) image"),
yading@10 265 };
yading@10 266 #endif
yading@10 267
yading@10 268 #if CONFIG_PBM_DECODER
yading@10 269 AVCodec ff_pbm_decoder = {
yading@10 270 .name = "pbm",
yading@10 271 .type = AVMEDIA_TYPE_VIDEO,
yading@10 272 .id = AV_CODEC_ID_PBM,
yading@10 273 .priv_data_size = sizeof(PNMContext),
yading@10 274 .decode = pnm_decode_frame,
yading@10 275 .capabilities = CODEC_CAP_DR1,
yading@10 276 .long_name = NULL_IF_CONFIG_SMALL("PBM (Portable BitMap) image"),
yading@10 277 };
yading@10 278 #endif
yading@10 279
yading@10 280 #if CONFIG_PAM_DECODER
yading@10 281 AVCodec ff_pam_decoder = {
yading@10 282 .name = "pam",
yading@10 283 .type = AVMEDIA_TYPE_VIDEO,
yading@10 284 .id = AV_CODEC_ID_PAM,
yading@10 285 .priv_data_size = sizeof(PNMContext),
yading@10 286 .decode = pnm_decode_frame,
yading@10 287 .capabilities = CODEC_CAP_DR1,
yading@10 288 .long_name = NULL_IF_CONFIG_SMALL("PAM (Portable AnyMap) image"),
yading@10 289 };
yading@10 290 #endif