annotate tmv.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 9dda7c2700ad
children
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
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
24 * @file
9616
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;
12184
9dda7c2700ad 8088flex TMV video decoder now uses ff_draw_pc_font()
pross
parents: 11644
diff changeset
42 uint8_t *dst;
9616
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;
12184
9dda7c2700ad 8088flex TMV video decoder now uses ff_draw_pc_font()
pross
parents: 11644
diff changeset
45 unsigned x, y, fg, bg, c;
9616
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++) {
12184
9dda7c2700ad 8088flex TMV video decoder now uses ff_draw_pc_font()
pross
parents: 11644
diff changeset
71 c = *src++;
9616
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;
12184
9dda7c2700ad 8088flex TMV video decoder now uses ff_draw_pc_font()
pross
parents: 11644
diff changeset
74 ff_draw_pc_font(dst + x * 8, tmv->pic.linesize[0],
9dda7c2700ad 8088flex TMV video decoder now uses ff_draw_pc_font()
pross
parents: 11644
diff changeset
75 ff_cga_font, 8, c, fg, bg);
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
76 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
77 dst += tmv->pic.linesize[0] * 8;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
78 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
79
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
80 *data_size = sizeof(AVFrame);
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
81 *(AVFrame *)data = tmv->pic;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
82 return avpkt->size;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
83 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
84
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
85 static av_cold int tmv_decode_close(AVCodecContext *avctx)
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
86 {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
87 TMVContext *tmv = avctx->priv_data;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
88
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
89 if (tmv->pic.data[0])
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
90 avctx->release_buffer(avctx, &tmv->pic);
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
91
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
92 return 0;
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
93 }
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
94
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
95 AVCodec tmv_decoder = {
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
96 .name = "tmv",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9813
diff changeset
97 .type = AVMEDIA_TYPE_VIDEO,
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
98 .id = CODEC_ID_TMV,
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
99 .priv_data_size = sizeof(TMVContext),
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
100 .close = tmv_decode_close,
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
101 .decode = tmv_decode_frame,
9813
569849bc0f40 tmv decoder uses get_buffer, set CODEC_CAP_DR1
bcoudurier
parents: 9663
diff changeset
102 .capabilities = CODEC_CAP_DR1,
9616
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
103 .long_name = NULL_IF_CONFIG_SMALL("8088flex TMV"),
fe6e82906aa8 Add 8088flex TMV video decoder.
stefano
parents:
diff changeset
104 };