/*
* Copyright (C) 2003-2004 the ffmpeg project
*
- * This library is free software; you can redistribute it and/or
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
*
- * This library is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "mpegvideo.h"
#include "vp3data.h"
+#include "xiph.h"
#define FRAGMENT_PIXELS 8
int bounding_values_array[256];
} Vp3DecodeContext;
-static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb);
-
/************************************************************************
* VP3 specific functions
************************************************************************/
{
int ac_scale_factor = s->coded_ac_scale_factor[s->quality_index];
int dc_scale_factor = s->coded_dc_scale_factor[s->quality_index];
- int i, j, plane, inter, qri, bmi, bmj, qistart;
+ int i, plane, inter, qri, bmi, bmj, qistart;
debug_vp3(" vp3: initializing dequantization tables\n");
int qmin= 8<<(inter + !i);
int qscale= i ? ac_scale_factor : dc_scale_factor;
- s->qmat[inter][plane][i]= clip((qscale * coeff)/100 * 4, qmin, 4096);
+ s->qmat[inter][plane][i]= av_clip((qscale * coeff)/100 * 4, qmin, 4096);
}
}
}
int x, y;
int i = first_fragment;
- short predicted_dc;
+ int predicted_dc;
/* DC values for the left, up-left, up, and up-right fragments */
int vl, vul, vu, vur;
/* check for outranging on the [ul u l] and
* [ul u ur l] predictors */
if ((transform == 13) || (transform == 15)) {
- if (ABS(predicted_dc - vu) > 128)
+ if (FFABS(predicted_dc - vu) > 128)
predicted_dc = vu;
- else if (ABS(predicted_dc - vl) > 128)
+ else if (FFABS(predicted_dc - vl) > 128)
predicted_dc = vl;
- else if (ABS(predicted_dc - vul) > 128)
+ else if (FFABS(predicted_dc - vul) > 128)
predicted_dc = vul;
}
if (!s->flipped_image) stride = -stride;
- if(ABS(stride) > 2048)
+ if(FFABS(stride) > 2048)
return; //various tables are fixed size
/* for each fragment row in the slice (both of them)... */
(first_pixel[-2] - first_pixel[ 1])
+3*(first_pixel[ 0] - first_pixel[-1]);
filter_value = bounding_values[(filter_value + 4) >> 3];
- first_pixel[-1] = clip_uint8(first_pixel[-1] + filter_value);
- first_pixel[ 0] = clip_uint8(first_pixel[ 0] - filter_value);
+ first_pixel[-1] = av_clip_uint8(first_pixel[-1] + filter_value);
+ first_pixel[ 0] = av_clip_uint8(first_pixel[ 0] - filter_value);
}
}
(first_pixel[2 * nstride] - first_pixel[ stride])
+3*(first_pixel[0 ] - first_pixel[nstride]);
filter_value = bounding_values[(filter_value + 4) >> 3];
- first_pixel[nstride] = clip_uint8(first_pixel[nstride] + filter_value);
- first_pixel[0] = clip_uint8(first_pixel[0] - filter_value);
+ first_pixel[nstride] = av_clip_uint8(first_pixel[nstride] + filter_value);
+ first_pixel[0] = av_clip_uint8(first_pixel[0] - filter_value);
}
}
s->width = (avctx->width + 15) & 0xFFFFFFF0;
s->height = (avctx->height + 15) & 0xFFFFFFF0;
avctx->pix_fmt = PIX_FMT_YUV420P;
- avctx->has_b_frames = 0;
if(avctx->idct_algo==FF_IDCT_AUTO)
avctx->idct_algo=FF_IDCT_VP3;
dsputil_init(&s->dsp, avctx);
if (s->theora && get_bits1(&gb))
{
-#if 1
av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n");
return -1;
-#else
- int ptype = get_bits(&gb, 7);
-
- skip_bits(&gb, 6*8); /* "theora" */
-
- switch(ptype)
- {
- case 1:
- theora_decode_comments(avctx, &gb);
- break;
- case 2:
- theora_decode_tables(avctx, &gb);
- init_dequantizer(s);
- break;
- default:
- av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype);
- }
- return buf_size;
-#endif
}
s->keyframe = !get_bits1(&gb);
Vp3DecodeContext *s = avctx->priv_data;
GetBitContext gb;
int ptype;
- uint8_t *p= avctx->extradata;
- int op_bytes, i;
+ uint8_t *header_start[3];
+ int header_len[3];
+ int i;
s->theora = 1;
return -1;
}
- for(i=0;i<3;i++) {
- op_bytes = *(p++)<<8;
- op_bytes += *(p++);
+ if (ff_split_xiph_headers(avctx->extradata, avctx->extradata_size,
+ 42, header_start, header_len) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Corrupt extradata\n");
+ return -1;
+ }
- init_get_bits(&gb, p, op_bytes);
- p += op_bytes;
+ for(i=0;i<3;i++) {
+ init_get_bits(&gb, header_start[i], header_len[i]);
ptype = get_bits(&gb, 8);
debug_vp3("Theora headerpacket type: %x\n", ptype);
// return -1;
}
- // FIXME: check for this aswell
+ // FIXME: Check for this as well.
skip_bits(&gb, 6*8); /* "theora" */
switch(ptype)
av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80);
break;
}
- if(8*op_bytes != get_bits_count(&gb))
- av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*op_bytes - get_bits_count(&gb), ptype);
+ if(8*header_len[i] != get_bits_count(&gb))
+ av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*header_len[i] - get_bits_count(&gb), ptype);
if (s->theora < 0x030200)
break;
}
return 0;
}
-AVCodec vp3_decoder = {
- "vp3",
+#ifdef CONFIG_THEORA_DECODER
+AVCodec theora_decoder = {
+ "theora",
CODEC_TYPE_VIDEO,
- CODEC_ID_VP3,
+ CODEC_ID_THEORA,
sizeof(Vp3DecodeContext),
- vp3_decode_init,
+ theora_decode_init,
NULL,
vp3_decode_end,
vp3_decode_frame,
0,
NULL
};
+#endif
-#ifndef CONFIG_LIBTHEORA
-AVCodec theora_decoder = {
- "theora",
+AVCodec vp3_decoder = {
+ "vp3",
CODEC_TYPE_VIDEO,
- CODEC_ID_THEORA,
+ CODEC_ID_VP3,
sizeof(Vp3DecodeContext),
- theora_decode_init,
+ vp3_decode_init,
NULL,
vp3_decode_end,
vp3_decode_frame,
0,
NULL
};
-#endif