annotate ffmpeg/libavcodec/sp5xdec.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 * Sunplus JPEG decoder (SP5X)
yading@10 3 * Copyright (c) 2003 Alex Beregszaszi
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 /**
yading@10 23 * @file
yading@10 24 * Sunplus JPEG decoder (SP5X).
yading@10 25 */
yading@10 26
yading@10 27 #include "avcodec.h"
yading@10 28 #include "mjpeg.h"
yading@10 29 #include "mjpegdec.h"
yading@10 30 #include "sp5x.h"
yading@10 31
yading@10 32
yading@10 33 static int sp5x_decode_frame(AVCodecContext *avctx,
yading@10 34 void *data, int *got_frame,
yading@10 35 AVPacket *avpkt)
yading@10 36 {
yading@10 37 const uint8_t *buf = avpkt->data;
yading@10 38 int buf_size = avpkt->size;
yading@10 39 AVPacket avpkt_recoded;
yading@10 40 const int qscale = 5;
yading@10 41 uint8_t *recoded;
yading@10 42 int i = 0, j = 0;
yading@10 43
yading@10 44 if (!avctx->width || !avctx->height)
yading@10 45 return -1;
yading@10 46
yading@10 47 recoded = av_mallocz(buf_size + 1024);
yading@10 48 if (!recoded)
yading@10 49 return -1;
yading@10 50
yading@10 51 /* SOI */
yading@10 52 recoded[j++] = 0xFF;
yading@10 53 recoded[j++] = 0xD8;
yading@10 54
yading@10 55 memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
yading@10 56 memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);
yading@10 57 memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);
yading@10 58 j += sizeof(sp5x_data_dqt);
yading@10 59
yading@10 60 memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
yading@10 61 j += sizeof(sp5x_data_dht);
yading@10 62
yading@10 63 memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));
yading@10 64 AV_WB16(recoded+j+5, avctx->coded_height);
yading@10 65 AV_WB16(recoded+j+7, avctx->coded_width);
yading@10 66 j += sizeof(sp5x_data_sof);
yading@10 67
yading@10 68 memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));
yading@10 69 j += sizeof(sp5x_data_sos);
yading@10 70
yading@10 71 if(avctx->codec_id==AV_CODEC_ID_AMV)
yading@10 72 for (i = 2; i < buf_size-2 && j < buf_size+1024-2; i++)
yading@10 73 recoded[j++] = buf[i];
yading@10 74 else
yading@10 75 for (i = 14; i < buf_size && j < buf_size+1024-3; i++)
yading@10 76 {
yading@10 77 recoded[j++] = buf[i];
yading@10 78 if (buf[i] == 0xff)
yading@10 79 recoded[j++] = 0;
yading@10 80 }
yading@10 81
yading@10 82 /* EOI */
yading@10 83 recoded[j++] = 0xFF;
yading@10 84 recoded[j++] = 0xD9;
yading@10 85
yading@10 86 av_init_packet(&avpkt_recoded);
yading@10 87 avpkt_recoded.data = recoded;
yading@10 88 avpkt_recoded.size = j;
yading@10 89 i = ff_mjpeg_decode_frame(avctx, data, got_frame, &avpkt_recoded);
yading@10 90
yading@10 91 av_free(recoded);
yading@10 92
yading@10 93 return i < 0 ? i : avpkt->size;
yading@10 94 }
yading@10 95
yading@10 96 #if CONFIG_SP5X_DECODER
yading@10 97 AVCodec ff_sp5x_decoder = {
yading@10 98 .name = "sp5x",
yading@10 99 .type = AVMEDIA_TYPE_VIDEO,
yading@10 100 .id = AV_CODEC_ID_SP5X,
yading@10 101 .priv_data_size = sizeof(MJpegDecodeContext),
yading@10 102 .init = ff_mjpeg_decode_init,
yading@10 103 .close = ff_mjpeg_decode_end,
yading@10 104 .decode = sp5x_decode_frame,
yading@10 105 .capabilities = CODEC_CAP_DR1,
yading@10 106 .max_lowres = 3,
yading@10 107 .long_name = NULL_IF_CONFIG_SMALL("Sunplus JPEG (SP5X)"),
yading@10 108 };
yading@10 109 #endif
yading@10 110 #if CONFIG_AMV_DECODER
yading@10 111 AVCodec ff_amv_decoder = {
yading@10 112 .name = "amv",
yading@10 113 .type = AVMEDIA_TYPE_VIDEO,
yading@10 114 .id = AV_CODEC_ID_AMV,
yading@10 115 .priv_data_size = sizeof(MJpegDecodeContext),
yading@10 116 .init = ff_mjpeg_decode_init,
yading@10 117 .close = ff_mjpeg_decode_end,
yading@10 118 .decode = sp5x_decode_frame,
yading@10 119 .long_name = NULL_IF_CONFIG_SMALL("AMV Video"),
yading@10 120 };
yading@10 121 #endif