* Ut Video decoder
*/
+#include <inttypes.h>
#include <stdlib.h>
#include "libavutil/intreadwrite.h"
+
#include "avcodec.h"
+#include "bitstream.h"
+#include "bswapdsp.h"
#include "bytestream.h"
-#include "get_bits.h"
-#include "dsputil.h"
#include "thread.h"
#include "utvideo.h"
}
static int decode_plane(UtvideoContext *c, int plane_no,
- uint8_t *dst, int step, int stride,
+ uint8_t *dst, int step, ptrdiff_t stride,
int width, int height,
const uint8_t *src, int use_pred)
{
int i, j, slice, pix;
int sstart, send;
VLC vlc;
- GetBitContext gb;
+ BitstreamContext bc;
int prev, fsym;
const int cmask = ~(!plane_no && c->avctx->pix_fmt == AV_PIX_FMT_YUV420P);
memcpy(c->slice_bits, src + slice_data_start + c->slices * 4,
slice_size);
- memset(c->slice_bits + slice_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
- c->dsp.bswap_buf((uint32_t *) c->slice_bits, (uint32_t *) c->slice_bits,
- (slice_data_end - slice_data_start + 3) >> 2);
- init_get_bits(&gb, c->slice_bits, slice_size * 8);
+ memset(c->slice_bits + slice_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+ c->bdsp.bswap_buf((uint32_t *) c->slice_bits,
+ (uint32_t *) c->slice_bits,
+ (slice_data_end - slice_data_start + 3) >> 2);
+ bitstream_init(&bc, c->slice_bits, slice_size * 8);
prev = 0x80;
for (j = sstart; j < send; j++) {
for (i = 0; i < width * step; i += step) {
- if (get_bits_left(&gb) <= 0) {
+ if (bitstream_bits_left(&bc) <= 0) {
av_log(c->avctx, AV_LOG_ERROR,
"Slice decoding ran out of bits\n");
goto fail;
}
- pix = get_vlc2(&gb, vlc.table, vlc.bits, 4);
+ pix = bitstream_read_vlc(&bc, vlc.table, vlc.bits, 4);
if (pix < 0) {
av_log(c->avctx, AV_LOG_ERROR, "Decoding error\n");
goto fail;
}
dest += stride;
}
- if (get_bits_left(&gb) > 32)
+ if (bitstream_bits_left(&bc) > 32)
av_log(c->avctx, AV_LOG_WARNING,
- "%d bits left after decoding slice\n", get_bits_left(&gb));
+ "%d bits left after decoding slice\n", bitstream_bits_left(&bc));
}
ff_free_vlc(&vlc);
return AVERROR_INVALIDDATA;
}
-static void restore_rgb_planes(uint8_t *src, int step, int stride, int width,
- int height)
+static void restore_rgb_planes(uint8_t *src, int step, ptrdiff_t stride,
+ int width, int height)
{
int i, j;
uint8_t r, g, b;
}
}
-static void restore_median(uint8_t *src, int step, int stride,
+static void restore_median(uint8_t *src, int step, ptrdiff_t stride,
int width, int height, int slices, int rmode)
{
int i, j, slice;
slice_start = ((slice * height) / slices) & cmask;
slice_height = ((((slice + 1) * height) / slices) & cmask) -
slice_start;
+ if (!slice_height)
+ continue;
bsrc = src + slice_start * stride;
* so restoring function should take care of possible padding between
* two parts of the same "line".
*/
-static void restore_median_il(uint8_t *src, int step, int stride,
+static void restore_median_il(uint8_t *src, int step, ptrdiff_t stride,
int width, int height, int slices, int rmode)
{
int i, j, slice;
uint8_t *bsrc;
int slice_start, slice_height;
const int cmask = ~(rmode ? 3 : 1);
- const int stride2 = stride << 1;
+ const ptrdiff_t stride2 = stride << 1;
for (slice = 0; slice < slices; slice++) {
slice_start = ((slice * height) / slices) & cmask;
slice_height = ((((slice + 1) * height) / slices) & cmask) -
slice_start;
slice_height >>= 1;
+ if (!slice_height)
+ continue;
bsrc = src + slice_start * stride;
return AVERROR_INVALIDDATA;
}
c->frame_info = bytestream2_get_le32u(&gb);
- av_log(avctx, AV_LOG_DEBUG, "frame information flags %X\n", c->frame_info);
+ av_log(avctx, AV_LOG_DEBUG, "frame information flags %"PRIX32"\n",
+ c->frame_info);
c->frame_pred = (c->frame_info >> 8) & 3;
}
av_fast_malloc(&c->slice_bits, &c->slice_bits_size,
- max_slice_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ max_slice_size + AV_INPUT_BUFFER_PADDING_SIZE);
if (!c->slice_bits) {
av_log(avctx, AV_LOG_ERROR, "Cannot allocate temporary buffer\n");
c->avctx = avctx;
- ff_dsputil_init(&c->dsp, avctx);
+ ff_bswapdsp_init(&c->bdsp);
if (avctx->extradata_size < 16) {
av_log(avctx, AV_LOG_ERROR,
av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
avctx->extradata[3], avctx->extradata[2],
avctx->extradata[1], avctx->extradata[0]);
- av_log(avctx, AV_LOG_DEBUG, "Original format %X\n",
+ av_log(avctx, AV_LOG_DEBUG, "Original format %"PRIX32"\n",
AV_RB32(avctx->extradata + 4));
c->frame_info_size = AV_RL32(avctx->extradata + 8);
c->flags = AV_RL32(avctx->extradata + 12);
if (c->frame_info_size != 4)
avpriv_request_sample(avctx, "Frame info not 4 bytes");
- av_log(avctx, AV_LOG_DEBUG, "Encoding parameters %08X\n", c->flags);
+ av_log(avctx, AV_LOG_DEBUG, "Encoding parameters %08"PRIX32"\n", c->flags);
c->slices = (c->flags >> 24) + 1;
c->compression = c->flags & 1;
c->interlaced = c->flags & 0x800;
AVCodec ff_utvideo_decoder = {
.name = "utvideo",
+ .long_name = NULL_IF_CONFIG_SMALL("Ut Video"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_UTVIDEO,
.priv_data_size = sizeof(UtvideoContext),
.init = decode_init,
.close = decode_end,
.decode = decode_frame,
- .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
- .long_name = NULL_IF_CONFIG_SMALL("Ut Video"),
+ .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
};