FFmpeg
Loading...
Searching...
No Matches
wnv1.c
Go to the documentation of this file.
1/*
2 * Winnov WNV1 codec
3 * Copyright (c) 2005 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * Winnov WNV1 codec.
25 */
26
27#include "libavutil/thread.h"
28
29#define BITSTREAM_READER_LE
30#include "avcodec.h"
31#include "codec_internal.h"
32#include "decode.h"
33#include "get_bits.h"
34
35static const uint8_t code_tab[16][2] = {
36 { 7, 1 }, { 8, 3 }, { 6, 3 }, { 9, 4 }, { 5, 4 }, { 10, 5 }, { 4, 5 },
37 { 11, 6 }, { 3, 6 }, { 12, 7 }, { 2, 7 }, { 13, 8 }, { 1, 8 }, { 14, 9 },
38 { 0, 9 }, { 15, 8 }
39};
40
41#define CODE_VLC_BITS 9
43
44/* returns modified base_value */
45static inline int wnv1_get_code(GetBitContext *gb, int shift, int base_value)
46{
47 int v = get_vlc2(gb, code_vlc, CODE_VLC_BITS, 1);
48
49 if (v == 8)
50 return get_bits(gb, 8 - shift) << shift;
51 else
52 return base_value + v * (1 << shift);
53}
54
55static int decode_frame(AVCodecContext *avctx, AVFrame *p,
56 int *got_frame, AVPacket *avpkt)
57{
58 const uint8_t *buf = avpkt->data;
59 int buf_size = avpkt->size;
61 unsigned char *Y,*U,*V;
62 int i, j, ret, shift;
63 int prev_y = 0, prev_u = 0, prev_v = 0;
64
65 if (buf_size < 8 + avctx->height * (avctx->width/2)/8) {
66 av_log(avctx, AV_LOG_ERROR, "Packet size %d is too small\n", buf_size);
68 }
69
70 if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
71 return ret;
72
73 if ((ret = init_get_bits8(&gb, buf + 8, buf_size - 8)) < 0)
74 return ret;
75
76 if (buf[2] >> 4 == 6)
77 shift = 2;
78 else {
79 shift = 8 - (buf[2] >> 4);
80 if (shift > 4) {
82 "Unknown WNV1 frame header value %i",
83 buf[2] >> 4);
84 shift = 4;
85 }
86 if (shift < 1) {
88 "Unknown WNV1 frame header value %i",
89 buf[2] >> 4);
90 shift = 1;
91 }
92 }
93
94 Y = p->data[0];
95 U = p->data[1];
96 V = p->data[2];
97 for (j = 0; j < avctx->height; j++) {
98 for (i = 0; i < avctx->width / 2; i++) {
99 Y[i * 2] = wnv1_get_code(&gb, shift, prev_y);
100 prev_u = U[i] = wnv1_get_code(&gb, shift, prev_u);
101 prev_y = Y[(i * 2) + 1] = wnv1_get_code(&gb, shift, Y[i * 2]);
102 prev_v = V[i] = wnv1_get_code(&gb, shift, prev_v);
103 }
104 Y += p->linesize[0];
105 U += p->linesize[1];
106 V += p->linesize[2];
107 }
108
109
110 *got_frame = 1;
111
112 return buf_size;
113}
114
115static av_cold void wnv1_init_static(void)
116{
118 &code_tab[0][1], 2,
119 &code_tab[0][0], 2, 1,
121}
122
124{
125 static AVOnce init_static_once = AV_ONCE_INIT;
126
127 if (avctx->width <= 1)
128 return AVERROR_INVALIDDATA;
129
131
132 ff_thread_once(&init_static_once, wnv1_init_static);
133
134 return 0;
135}
136
138 .p.name = "wnv1",
139 CODEC_LONG_NAME("Winnov WNV1"),
140 .p.type = AVMEDIA_TYPE_VIDEO,
141 .p.id = AV_CODEC_ID_WNV1,
142 .init = decode_init,
144 .p.capabilities = AV_CODEC_CAP_DR1,
145};
const FFCodec ff_wnv1_decoder
Definition wnv1.c:137
#define U(x)
Definition vpx_arith.h:37
Libavcodec external API header.
#define V
Definition avdct.c:32
#define Y
Definition boxblur.h:37
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition decode.c:1777
bitstream reader API header.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition get_bits.h:645
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AV_CODEC_ID_WNV1
Definition codec_id.h:123
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define CODE_VLC_BITS
Definition indeo2.c:44
static av_cold int decode_init(AVCodecContext *avctx)
Definition 4xm.c:998
static int decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
Definition 4xm.c:837
static int shift(int a, int b)
Definition bonk.c:261
#define av_cold
Definition attributes.h:117
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
Definition vlc.h:32
#define avpriv_request_sample(...)
#define av_log(a,...)
#define height
Definition dsp.h:89
#define VLC_INIT_OUTPUT_LE
Definition vlc.h:196
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
Definition vlc.h:288
static int wnv1_get_code(GetBitContext *gb, int shift, int base_value)
Definition wnv1.c:45
static const uint8_t code_tab[16][2]
Definition wnv1.c:35
static av_cold int decode_init(AVCodecContext *avctx)
Definition wnv1.c:123
static av_cold void wnv1_init_static(void)
Definition wnv1.c:115
static int decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
Definition wnv1.c:55
static VLCElem code_vlc[1<< CODE_VLC_BITS]
Definition wnv1.c:42