annotate tmv.c @ 11560:8a4984c5cacc libavcodec

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 569849bc0f40
children 7dd2a45249a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
1 /*
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
2 * 8088flex TMV video decoder
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
3 * Copyright (c) 2009 Daniel Verkamp <daniel at drv.nu>
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
4 *
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
5 * This file is part of FFmpeg.
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
6 *
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
11 *
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
15 * Lesser General Public License for more details.
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
16 *
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
20 */
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
21
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
22 /**
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
23 * 8088flex TMV video decoder
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
24 * @file libavcodec/tmv.c
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
25 * @author Daniel Verkamp
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
26 * @sa http://www.oldskool.org/pc/8088_Corruption
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
27 */
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
28
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
29 #include "avcodec.h"
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
30
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
31 #include "cga_data.h"
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
32
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
33 typedef struct TMVContext {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
34 AVFrame pic;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
35 } TMVContext;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
36
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
37 static int tmv_decode_frame(AVCodecContext *avctx, void *data,
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
38 int *data_size, AVPacket *avpkt)
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
39 {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
40 TMVContext *tmv = avctx->priv_data;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
41 const uint8_t *src = avpkt->data;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
42 uint8_t *dst, *dst_char;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
43 unsigned char_cols = avctx->width >> 3;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
44 unsigned char_rows = avctx->height >> 3;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
45 unsigned x, y, mask, char_y, fg, bg, c;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
46
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
47 if (tmv->pic.data[0])
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
48 avctx->release_buffer(avctx, &tmv->pic);
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
49
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
50 if (avctx->get_buffer(avctx, &tmv->pic) < 0) {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
51 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
52 return -1;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
53 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
54
9663
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
55 if (avpkt->size < 2*char_rows*char_cols) {
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
56 av_log(avctx, AV_LOG_ERROR,
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
57 "Input buffer too small, truncated sample?\n");
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
58 *data_size = 0;
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
59 return -1;
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
60 }
041c635d0f69 Make TMV decoder check packet sizes before reading from it.
vitor
parents: 9616
diff changeset
61
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
62 tmv->pic.pict_type = FF_I_TYPE;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
63 tmv->pic.key_frame = 1;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
64 dst = tmv->pic.data[0];
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
65
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
66 tmv->pic.palette_has_changed = 1;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
67 memcpy(tmv->pic.data[1], ff_cga_palette, 16 * 4);
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
68
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
69 for (y = 0; y < char_rows; y++) {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
70 for (x = 0; x < char_cols; x++) {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
71 c = *src++ * 8;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
72 bg = *src >> 4;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
73 fg = *src++ & 0xF;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
74
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
75 dst_char = dst + x * 8;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
76 for (char_y = 0; char_y < 8; char_y++) {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
77 for (mask = 0x80; mask; mask >>= 1) {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
78 *dst_char++ = ff_cga_font[c + char_y] & mask ? fg : bg;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
79 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
80 dst_char += tmv->pic.linesize[0] - 8;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
81 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
82 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
83 dst += tmv->pic.linesize[0] * 8;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
84 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
85
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
86 *data_size = sizeof(AVFrame);
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
87 *(AVFrame *)data = tmv->pic;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
88 return avpkt->size;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
89 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
90
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
91 static av_cold int tmv_decode_close(AVCodecContext *avctx)
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
92 {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
93 TMVContext *tmv = avctx->priv_data;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
94
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
95 if (tmv->pic.data[0])
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
96 avctx->release_buffer(avctx, &tmv->pic);
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
97
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
98 return 0;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
99 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
100
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
101 AVCodec tmv_decoder = {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
102 .name = "tmv",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9813
diff changeset
103 .type = AVMEDIA_TYPE_VIDEO,
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
104 .id = CODEC_ID_TMV,
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
105 .priv_data_size = sizeof(TMVContext),
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
106 .close = tmv_decode_close,
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
107 .decode = tmv_decode_frame,
9813
569849bc0f40 tmv decoder uses get_buffer, set CODEC_CAP_DR1
bcoudurier
parents: 9663
diff changeset
108 .capabilities = CODEC_CAP_DR1,
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
109 .long_name = NULL_IF_CONFIG_SMALL("8088flex TMV"),
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
110 };