Libav 0.7.1
|
00001 /* 00002 * id Quake II CIN Video Decoder 00003 * Copyright (C) 2003 the ffmpeg project 00004 * 00005 * This file is part of Libav. 00006 * 00007 * Libav is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * Libav is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with Libav; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 */ 00021 00047 #include <stdio.h> 00048 #include <stdlib.h> 00049 #include <string.h> 00050 00051 #include "avcodec.h" 00052 00053 #define HUFFMAN_TABLE_SIZE 64 * 1024 00054 #define HUF_TOKENS 256 00055 #define PALETTE_COUNT 256 00056 00057 typedef struct 00058 { 00059 int count; 00060 unsigned char used; 00061 int children[2]; 00062 } hnode; 00063 00064 typedef struct IdcinContext { 00065 00066 AVCodecContext *avctx; 00067 AVFrame frame; 00068 00069 const unsigned char *buf; 00070 int size; 00071 00072 hnode huff_nodes[256][HUF_TOKENS*2]; 00073 int num_huff_nodes[256]; 00074 00075 uint32_t pal[256]; 00076 } IdcinContext; 00077 00078 /* 00079 * Find the lowest probability node in a Huffman table, and mark it as 00080 * being assigned to a higher probability. 00081 * @return the node index of the lowest unused node, or -1 if all nodes 00082 * are used. 00083 */ 00084 static int huff_smallest_node(hnode *hnodes, int num_hnodes) { 00085 int i; 00086 int best, best_node; 00087 00088 best = 99999999; 00089 best_node = -1; 00090 for(i = 0; i < num_hnodes; i++) { 00091 if(hnodes[i].used) 00092 continue; 00093 if(!hnodes[i].count) 00094 continue; 00095 if(hnodes[i].count < best) { 00096 best = hnodes[i].count; 00097 best_node = i; 00098 } 00099 } 00100 00101 if(best_node == -1) 00102 return -1; 00103 hnodes[best_node].used = 1; 00104 return best_node; 00105 } 00106 00107 /* 00108 * Build the Huffman tree using the generated/loaded probabilities histogram. 00109 * 00110 * On completion: 00111 * huff_nodes[prev][i < HUF_TOKENS] - are the nodes at the base of the tree. 00112 * huff_nodes[prev][i >= HUF_TOKENS] - are used to construct the tree. 00113 * num_huff_nodes[prev] - contains the index to the root node of the tree. 00114 * That is: huff_nodes[prev][num_huff_nodes[prev]] is the root node. 00115 */ 00116 static av_cold void huff_build_tree(IdcinContext *s, int prev) { 00117 hnode *node, *hnodes; 00118 int num_hnodes, i; 00119 00120 num_hnodes = HUF_TOKENS; 00121 hnodes = s->huff_nodes[prev]; 00122 for(i = 0; i < HUF_TOKENS * 2; i++) 00123 hnodes[i].used = 0; 00124 00125 while (1) { 00126 node = &hnodes[num_hnodes]; /* next free node */ 00127 00128 /* pick two lowest counts */ 00129 node->children[0] = huff_smallest_node(hnodes, num_hnodes); 00130 if(node->children[0] == -1) 00131 break; /* reached the root node */ 00132 00133 node->children[1] = huff_smallest_node(hnodes, num_hnodes); 00134 if(node->children[1] == -1) 00135 break; /* reached the root node */ 00136 00137 /* combine nodes probability for new node */ 00138 node->count = hnodes[node->children[0]].count + 00139 hnodes[node->children[1]].count; 00140 num_hnodes++; 00141 } 00142 00143 s->num_huff_nodes[prev] = num_hnodes - 1; 00144 } 00145 00146 static av_cold int idcin_decode_init(AVCodecContext *avctx) 00147 { 00148 IdcinContext *s = avctx->priv_data; 00149 int i, j, histogram_index = 0; 00150 unsigned char *histograms; 00151 00152 s->avctx = avctx; 00153 avctx->pix_fmt = PIX_FMT_PAL8; 00154 00155 /* make sure the Huffman tables make it */ 00156 if (s->avctx->extradata_size != HUFFMAN_TABLE_SIZE) { 00157 av_log(s->avctx, AV_LOG_ERROR, " id CIN video: expected extradata size of %d\n", HUFFMAN_TABLE_SIZE); 00158 return -1; 00159 } 00160 00161 /* build the 256 Huffman decode trees */ 00162 histograms = (unsigned char *)s->avctx->extradata; 00163 for (i = 0; i < 256; i++) { 00164 for(j = 0; j < HUF_TOKENS; j++) 00165 s->huff_nodes[i][j].count = histograms[histogram_index++]; 00166 huff_build_tree(s, i); 00167 } 00168 00169 s->frame.data[0] = NULL; 00170 00171 return 0; 00172 } 00173 00174 static void idcin_decode_vlcs(IdcinContext *s) 00175 { 00176 hnode *hnodes; 00177 long x, y; 00178 int prev; 00179 unsigned char v = 0; 00180 int bit_pos, node_num, dat_pos; 00181 00182 prev = bit_pos = dat_pos = 0; 00183 for (y = 0; y < (s->frame.linesize[0] * s->avctx->height); 00184 y += s->frame.linesize[0]) { 00185 for (x = y; x < y + s->avctx->width; x++) { 00186 node_num = s->num_huff_nodes[prev]; 00187 hnodes = s->huff_nodes[prev]; 00188 00189 while(node_num >= HUF_TOKENS) { 00190 if(!bit_pos) { 00191 if(dat_pos >= s->size) { 00192 av_log(s->avctx, AV_LOG_ERROR, "Huffman decode error.\n"); 00193 return; 00194 } 00195 bit_pos = 8; 00196 v = s->buf[dat_pos++]; 00197 } 00198 00199 node_num = hnodes[node_num].children[v & 0x01]; 00200 v = v >> 1; 00201 bit_pos--; 00202 } 00203 00204 s->frame.data[0][x] = node_num; 00205 prev = node_num; 00206 } 00207 } 00208 } 00209 00210 static int idcin_decode_frame(AVCodecContext *avctx, 00211 void *data, int *data_size, 00212 AVPacket *avpkt) 00213 { 00214 const uint8_t *buf = avpkt->data; 00215 int buf_size = avpkt->size; 00216 IdcinContext *s = avctx->priv_data; 00217 const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); 00218 00219 s->buf = buf; 00220 s->size = buf_size; 00221 00222 if (s->frame.data[0]) 00223 avctx->release_buffer(avctx, &s->frame); 00224 00225 if (avctx->get_buffer(avctx, &s->frame)) { 00226 av_log(avctx, AV_LOG_ERROR, " id CIN Video: get_buffer() failed\n"); 00227 return -1; 00228 } 00229 00230 idcin_decode_vlcs(s); 00231 00232 if (pal) { 00233 s->frame.palette_has_changed = 1; 00234 memcpy(s->pal, pal, AVPALETTE_SIZE); 00235 } 00236 /* make the palette available on the way out */ 00237 memcpy(s->frame.data[1], s->pal, AVPALETTE_SIZE); 00238 00239 *data_size = sizeof(AVFrame); 00240 *(AVFrame*)data = s->frame; 00241 00242 /* report that the buffer was completely consumed */ 00243 return buf_size; 00244 } 00245 00246 static av_cold int idcin_decode_end(AVCodecContext *avctx) 00247 { 00248 IdcinContext *s = avctx->priv_data; 00249 00250 if (s->frame.data[0]) 00251 avctx->release_buffer(avctx, &s->frame); 00252 00253 return 0; 00254 } 00255 00256 AVCodec ff_idcin_decoder = { 00257 "idcinvideo", 00258 AVMEDIA_TYPE_VIDEO, 00259 CODEC_ID_IDCIN, 00260 sizeof(IdcinContext), 00261 idcin_decode_init, 00262 NULL, 00263 idcin_decode_end, 00264 idcin_decode_frame, 00265 CODEC_CAP_DR1, 00266 .long_name = NULL_IF_CONFIG_SMALL("id Quake II CIN video"), 00267 }; 00268