annotate svq1dec.c @ 6944:030cc3278868 libavcodec

As *_static are not deallocated anymore except on program termination we do not need to keep track of them anymore. Fixes CID117 RUN2 and various race conditions.
author michael
date Fri, 30 May 2008 23:26:09 +0000
parents e1302edb0f69
children e943e1409077
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
1 /*
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
2 * SVQ1 decoder
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
3 * ported to MPlayer by Arpi <arpi@thot.banki.hu>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
4 * ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
5 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
6 * Copyright (C) 2002 the xine project
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
7 * Copyright (C) 2002 the ffmpeg project
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
8 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
9 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
10 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
11 * This file is part of FFmpeg.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
12 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
13 * FFmpeg is free software; you can redistribute it and/or
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
14 * modify it under the terms of the GNU Lesser General Public
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
15 * License as published by the Free Software Foundation; either
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
16 * version 2.1 of the License, or (at your option) any later version.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
17 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
18 * FFmpeg is distributed in the hope that it will be useful,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
21 * Lesser General Public License for more details.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
22 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
23 * You should have received a copy of the GNU Lesser General Public
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
24 * License along with FFmpeg; if not, write to the Free Software
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
26 */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
27
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
28 /**
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
29 * @file svq1.c
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
30 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
31 * For more information of the SVQ1 algorithm, visit:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
32 * http://www.pcisys.net/~melanson/codecs/
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
33 */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
34
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
35
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
36 //#define DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
37 #include "avcodec.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
38 #include "dsputil.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
39 #include "mpegvideo.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
40
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
41 #include "svq1.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
42
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
43 #undef NDEBUG
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
44 #include <assert.h>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
45
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
46 extern const uint8_t mvtab[33][2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
47
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
48 static VLC svq1_block_type;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
49 static VLC svq1_motion_component;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
50 static VLC svq1_intra_multistage[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
51 static VLC svq1_inter_multistage[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
52 static VLC svq1_intra_mean;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
53 static VLC svq1_inter_mean;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
54
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
55 /* motion vector (prediction) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
56 typedef struct svq1_pmv_s {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
57 int x;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
58 int y;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
59 } svq1_pmv_t;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
60
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
61 static const uint16_t checksum_table[256] = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
62 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
63 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
64 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
65 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
66 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
67 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
68 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
69 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
70 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
71 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
72 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
73 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
74 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
75 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
76 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
77 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
78 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
79 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
80 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
81 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
82 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
83 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
84 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
85 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
86 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
87 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
88 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
89 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
90 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
91 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
92 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
93 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
94 };
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
95
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
96 static const uint8_t string_table[256] = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
97 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
98 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
99 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
100 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
101 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
102 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
103 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
104 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
105 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
106 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
107 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
108 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
109 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
110 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
111 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
112 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
113 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
114 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
115 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
116 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
117 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
118 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
119 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
120 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
121 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
122 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
123 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
124 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
125 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
126 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
127 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
128 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
129 };
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
130
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
131 #define SVQ1_PROCESS_VECTOR()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
132 for (; level > 0; i++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
133 /* process next depth */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
134 if (i == m) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
135 m = n;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
136 if (--level == 0)\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
137 break;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
138 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
139 /* divide block if next bit set */\
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
140 if (get_bits1 (bitbuf) == 0)\
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
141 break;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
142 /* add child nodes */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
143 list[n++] = list[i];\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
144 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
145 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
146
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
147 #define SVQ1_ADD_CODEBOOK()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
148 /* add codebook entries to vector */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
149 for (j=0; j < stages; j++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
150 n3 = codebook[entries[j]] ^ 0x80808080;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
151 n1 += ((n3 & 0xFF00FF00) >> 8);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
152 n2 += (n3 & 0x00FF00FF);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
153 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
154 \
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
155 /* clip to [0..255] */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
156 if (n1 & 0xFF00FF00) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
157 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
158 n1 += 0x7F007F00;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
159 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
160 n1 &= (n3 & 0x00FF00FF);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
161 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
162 \
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
163 if (n2 & 0xFF00FF00) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
164 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
165 n2 += 0x7F007F00;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
166 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
167 n2 &= (n3 & 0x00FF00FF);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
168 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
169
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
170 #define SVQ1_DO_CODEBOOK_INTRA()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
171 for (y=0; y < height; y++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
172 for (x=0; x < (width / 4); x++, codebook++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
173 n1 = n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
174 n2 = n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
175 SVQ1_ADD_CODEBOOK()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
176 /* store result */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
177 dst[x] = (n1 << 8) | n2;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
178 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
179 dst += (pitch / 4);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
180 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
181
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
182 #define SVQ1_DO_CODEBOOK_NONINTRA()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
183 for (y=0; y < height; y++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
184 for (x=0; x < (width / 4); x++, codebook++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
185 n3 = dst[x];\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
186 /* add mean value to vector */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
187 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
188 n2 = (n3 & 0x00FF00FF) + n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
189 SVQ1_ADD_CODEBOOK()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
190 /* store result */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
191 dst[x] = (n1 << 8) | n2;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
192 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
193 dst += (pitch / 4);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
194 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
195
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
196 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
197 codebook = (const uint32_t *) cbook[level];\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
198 bit_cache = get_bits (bitbuf, 4*stages);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
199 /* calculate codebook entries for this vector */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
200 for (j=0; j < stages; j++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
201 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
202 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
203 mean -= (stages * 128);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
204 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
205
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
206 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
207 uint32_t bit_cache;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
208 uint8_t *list[63];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
209 uint32_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
210 const uint32_t *codebook;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
211 int entries[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
212 int i, j, m, n;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
213 int mean, stages;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
214 unsigned x, y, width, height, level;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
215 uint32_t n1, n2, n3, n4;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
216
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
217 /* initialize list for breadth first processing of vectors */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
218 list[0] = pixels;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
219
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
220 /* recursively process vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
221 for (i=0, m=1, n=1, level=5; i < n; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
222 SVQ1_PROCESS_VECTOR();
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
223
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
224 /* destination address and vector size */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
225 dst = (uint32_t *) list[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
226 width = 1 << ((4 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
227 height = 1 << ((3 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
228
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
229 /* get number of stages (-1 skips vector, 0 for mean only) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
230 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
231
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
232 if (stages == -1) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
233 for (y=0; y < height; y++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
234 memset (&dst[y*(pitch / 4)], 0, width);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
235 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
236 continue; /* skip vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
237 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
238
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
239 if ((stages > 0) && (level >= 4)) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
240 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
241 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
242 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
243 return -1; /* invalid vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
244 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
245
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
246 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
247
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
248 if (stages == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
249 for (y=0; y < height; y++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
250 memset (&dst[y*(pitch / 4)], mean, width);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
251 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
252 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
253 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
254 SVQ1_DO_CODEBOOK_INTRA()
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
255 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
256 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
257
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
258 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
259 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
260
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
261 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
262 uint32_t bit_cache;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
263 uint8_t *list[63];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
264 uint32_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
265 const uint32_t *codebook;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
266 int entries[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
267 int i, j, m, n;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
268 int mean, stages;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
269 int x, y, width, height, level;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
270 uint32_t n1, n2, n3, n4;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
271
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
272 /* initialize list for breadth first processing of vectors */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
273 list[0] = pixels;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
274
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
275 /* recursively process vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
276 for (i=0, m=1, n=1, level=5; i < n; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
277 SVQ1_PROCESS_VECTOR();
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
278
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
279 /* destination address and vector size */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
280 dst = (uint32_t *) list[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
281 width = 1 << ((4 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
282 height = 1 << ((3 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
283
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
284 /* get number of stages (-1 skips vector, 0 for mean only) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
285 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
286
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
287 if (stages == -1) continue; /* skip vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
288
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
289 if ((stages > 0) && (level >= 4)) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
290 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
291 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
292 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
293 return -1; /* invalid vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
294 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
295
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
296 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
297
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
298 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
299 SVQ1_DO_CODEBOOK_NONINTRA()
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
300 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
301 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
302 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
303
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
304 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
305 int diff;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
306 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
307
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
308 for (i=0; i < 2; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
309
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
310 /* get motion code */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
311 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
312 if(diff<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
313 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
314 else if(diff){
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
315 if(get_bits1(bitbuf)) diff= -diff;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
316 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
317
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
318 /* add median of motion vector predictors and clip result */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
319 if (i == 1)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
320 mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
321 else
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
322 mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
323 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
324
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
325 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
326 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
327
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
328 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
329 uint8_t *src;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
330 uint8_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
331 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
332
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
333 src = &previous[x + y*pitch];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
334 dst = current;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
335
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
336 for (i=0; i < 16; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
337 memcpy (dst, src, 16);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
338 src += pitch;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
339 dst += pitch;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
340 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
341 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
342
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
343 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
344 uint8_t *current, uint8_t *previous, int pitch,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
345 svq1_pmv_t *motion, int x, int y) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
346 uint8_t *src;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
347 uint8_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
348 svq1_pmv_t mv;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
349 svq1_pmv_t *pmv[3];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
350 int result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
351
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
352 /* predict and decode motion vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
353 pmv[0] = &motion[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
354 if (y == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
355 pmv[1] =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
356 pmv[2] = pmv[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
357 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
358 else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
359 pmv[1] = &motion[(x / 8) + 2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
360 pmv[2] = &motion[(x / 8) + 4];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
361 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
362
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
363 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
364
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
365 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
366 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
367
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
368 motion[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
369 motion[(x / 8) + 2].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
370 motion[(x / 8) + 3].x = mv.x;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
371 motion[0].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
372 motion[(x / 8) + 2].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
373 motion[(x / 8) + 3].y = mv.y;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
374
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
375 if(y + (mv.y >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
376 mv.y= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
377 if(x + (mv.x >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
378 mv.x= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
379
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
380 #if 0
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
381 int w= (s->width+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
382 int h= (s->height+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
383 if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
384 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
385 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
386
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
387 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
388 dst = current;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
389
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
390 s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
391
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
392 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
393 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
394
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
395 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
396 uint8_t *current, uint8_t *previous, int pitch,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
397 svq1_pmv_t *motion,int x, int y) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
398 uint8_t *src;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
399 uint8_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
400 svq1_pmv_t mv;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
401 svq1_pmv_t *pmv[4];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
402 int i, result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
403
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
404 /* predict and decode motion vector (0) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
405 pmv[0] = &motion[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
406 if (y == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
407 pmv[1] =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
408 pmv[2] = pmv[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
409 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
410 else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
411 pmv[1] = &motion[(x / 8) + 2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
412 pmv[2] = &motion[(x / 8) + 4];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
413 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
414
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
415 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
416
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
417 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
418 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
419
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
420 /* predict and decode motion vector (1) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
421 pmv[0] = &mv;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
422 if (y == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
423 pmv[1] =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
424 pmv[2] = pmv[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
425 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
426 else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
427 pmv[1] = &motion[(x / 8) + 3];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
428 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
429 result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
430
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
431 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
432 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
433
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
434 /* predict and decode motion vector (2) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
435 pmv[1] = &motion[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
436 pmv[2] = &motion[(x / 8) + 1];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
437
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
438 result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
439
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
440 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
441 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
442
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
443 /* predict and decode motion vector (3) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
444 pmv[2] = &motion[(x / 8) + 2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
445 pmv[3] = &motion[(x / 8) + 3];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
446
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
447 result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
448
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
449 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
450 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
451
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
452 /* form predictions */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
453 for (i=0; i < 4; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
454 int mvx= pmv[i]->x + (i&1)*16;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
455 int mvy= pmv[i]->y + (i>>1)*16;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
456
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
457 ///XXX /FIXME clipping or padding?
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
458 if(y + (mvy >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
459 mvy= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
460 if(x + (mvx >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
461 mvx= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
462
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
463 #if 0
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
464 int w= (s->width+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
465 int h= (s->height+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
466 if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
467 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
468 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
469 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
470 dst = current;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
471
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
472 s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
473
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
474 /* select next block */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
475 if (i & 1) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
476 current += 8*(pitch - 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
477 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
478 current += 8;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
479 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
480 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
481
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
482 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
483 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
484
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
485 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
486 uint8_t *current, uint8_t *previous, int pitch,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
487 svq1_pmv_t *motion, int x, int y) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
488 uint32_t block_type;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
489 int result = 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
490
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
491 /* get block type */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
492 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
493
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
494 /* reset motion vectors */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
495 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
496 motion[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
497 motion[0].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
498 motion[(x / 8) + 2].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
499 motion[(x / 8) + 2].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
500 motion[(x / 8) + 3].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
501 motion[(x / 8) + 3].y = 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
502 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
503
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
504 switch (block_type) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
505 case SVQ1_BLOCK_SKIP:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
506 svq1_skip_block (current, previous, pitch, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
507 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
508
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
509 case SVQ1_BLOCK_INTER:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
510 result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
511
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
512 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
513 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
514 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
515 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
516 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
517 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
518 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
519 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
520 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
521
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
522 case SVQ1_BLOCK_INTER_4V:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
523 result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
524
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
525 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
526 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
527 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
528 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
529 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
530 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
531 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
532 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
533 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
534
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
535 case SVQ1_BLOCK_INTRA:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
536 result = svq1_decode_block_intra (bitbuf, current, pitch);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
537 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
538 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
539
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
540 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
541 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
542
6148
84071d68a7ca Add const qualifiers to unmodified function parameters, fixes the warning:
diego
parents: 6147
diff changeset
543 static uint16_t svq1_packet_checksum (const uint8_t *data, const int length, int value) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
544 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
545
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
546 for (i=0; i < length; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
547 value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
548 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
549
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
550 return value;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
551 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
552
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
553 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
554 uint8_t seed;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
555 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
556
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
557 out[0] = get_bits (bitbuf, 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
558
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
559 seed = string_table[out[0]];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
560
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
561 for (i=1; i <= out[0]; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
562 out[i] = get_bits (bitbuf, 8) ^ seed;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
563 seed = string_table[out[i] ^ seed];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
564 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
565 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
566
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
567 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
568 int frame_size_code;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
569 int temporal_reference;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
570
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
571 temporal_reference = get_bits (bitbuf, 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
572
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
573 /* frame type */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
574 s->pict_type= get_bits (bitbuf, 2)+1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
575 if(s->pict_type==4)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
576 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
577
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
578 if (s->pict_type == FF_I_TYPE) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
579
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
580 /* unknown fields */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
581 if (s->f_code == 0x50 || s->f_code == 0x60) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
582 int csum = get_bits (bitbuf, 16);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
583
6147
27b50e016757 Remove bogus cast.
diego
parents: 5513
diff changeset
584 csum = svq1_packet_checksum (bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
585
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
586 // av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
587 // (csum == 0) ? "correct" : "incorrect", csum);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
588 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
589
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
590 if ((s->f_code ^ 0x10) >= 0x50) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
591 uint8_t msg[256];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
592
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
593 svq1_parse_string (bitbuf, msg);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
594
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
595 av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
596 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
597
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
598 skip_bits (bitbuf, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
599 skip_bits (bitbuf, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
600 skip_bits1 (bitbuf);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
601
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
602 /* load frame size */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
603 frame_size_code = get_bits (bitbuf, 3);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
604
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
605 if (frame_size_code == 7) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
606 /* load width, height (12 bits each) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
607 s->width = get_bits (bitbuf, 12);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
608 s->height = get_bits (bitbuf, 12);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
609
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
610 if (!s->width || !s->height)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
611 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
612 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
613 /* get width, height from table */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
614 s->width = ff_svq1_frame_size_table[frame_size_code].width;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
615 s->height = ff_svq1_frame_size_table[frame_size_code].height;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
616 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
617 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
618
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
619 /* unknown fields */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
620 if (get_bits1 (bitbuf) == 1) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
621 skip_bits1 (bitbuf); /* use packet checksum if (1) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
622 skip_bits1 (bitbuf); /* component checksums after image data if (1) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
623
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
624 if (get_bits (bitbuf, 2) != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
625 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
626 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
627
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
628 if (get_bits1 (bitbuf) == 1) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
629 skip_bits1 (bitbuf);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
630 skip_bits (bitbuf, 4);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
631 skip_bits1 (bitbuf);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
632 skip_bits (bitbuf, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
633
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
634 while (get_bits1 (bitbuf) == 1) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
635 skip_bits (bitbuf, 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
636 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
637 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
638
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
639 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
640 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
641
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
642 static int svq1_decode_frame(AVCodecContext *avctx,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
643 void *data, int *data_size,
6280
b79673718ed8 some const
michael
parents: 6148
diff changeset
644 const uint8_t *buf, int buf_size)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
645 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
646 MpegEncContext *s=avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
647 uint8_t *current, *previous;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
648 int result, i, x, y, width, height;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
649 AVFrame *pict = data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
650
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
651 /* initialize bit buffer */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
652 init_get_bits(&s->gb,buf,buf_size*8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
653
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
654 /* decode frame header */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
655 s->f_code = get_bits (&s->gb, 22);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
656
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
657 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
658 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
659
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
660 /* swap some header bytes (why?) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
661 if (s->f_code != 0x20) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
662 uint32_t *src = (uint32_t *) (buf + 4);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
663
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
664 for (i=0; i < 4; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
665 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
666 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
667 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
668
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
669 result = svq1_decode_frame_header (&s->gb, s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
670
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
671 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
672 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
673 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
674 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
675 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
676 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
677 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
678
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
679 //FIXME this avoids some confusion for "B frames" without 2 references
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
680 //this should be removed after libavcodec can handle more flexible picture types & ordering
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
681 if(s->pict_type==FF_B_TYPE && s->last_picture_ptr==NULL) return buf_size;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
682
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
683 if(avctx->hurry_up && s->pict_type==FF_B_TYPE) return buf_size;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
684 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==FF_B_TYPE)
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
685 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=FF_I_TYPE)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
686 || avctx->skip_frame >= AVDISCARD_ALL)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
687 return buf_size;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
688
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
689 if(MPV_frame_start(s, avctx) < 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
690 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
691
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
692 /* decode y, u and v components */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
693 for (i=0; i < 3; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
694 int linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
695 if (i == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
696 width = (s->width+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
697 height = (s->height+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
698 linesize= s->linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
699 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
700 if(s->flags&CODEC_FLAG_GRAY) break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
701 width = (s->width/4+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
702 height = (s->height/4+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
703 linesize= s->uvlinesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
704 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
705
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
706 current = s->current_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
707
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
708 if(s->pict_type==FF_B_TYPE){
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
709 previous = s->next_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
710 }else{
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
711 previous = s->last_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
712 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
713
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
714 if (s->pict_type == FF_I_TYPE) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
715 /* keyframe */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
716 for (y=0; y < height; y+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
717 for (x=0; x < width; x+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
718 result = svq1_decode_block_intra (&s->gb, &current[x], linesize);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
719 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
720 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
721 //#ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
722 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
723 //#endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
724 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
725 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
726 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
727 current += 16*linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
728 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
729 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
730 svq1_pmv_t pmv[width/8+3];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
731 /* delta frame */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
732 memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv_t));
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
733
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
734 for (y=0; y < height; y+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
735 for (x=0; x < width; x+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
736 result = svq1_decode_delta_block (s, &s->gb, &current[x], previous,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
737 linesize, pmv, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
738 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
739 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
740 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
741 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
742 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
743 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
744 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
745 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
746
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
747 pmv[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
748 pmv[0].y = 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
749
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
750 current += 16*linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
751 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
752 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
753 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
754
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
755 *pict = *(AVFrame*)&s->current_picture;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
756
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
757
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
758 MPV_frame_end(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
759
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
760 *data_size=sizeof(AVFrame);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
761 return buf_size;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
762 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
763
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
764 static av_cold int svq1_decode_init(AVCodecContext *avctx)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
765 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
766 MpegEncContext *s = avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
767 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
768
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
769 MPV_decode_defaults(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
770
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
771 s->avctx = avctx;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
772 s->width = (avctx->width+3)&~3;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
773 s->height = (avctx->height+3)&~3;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
774 s->codec_id= avctx->codec->id;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
775 avctx->pix_fmt = PIX_FMT_YUV410P;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
776 avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
777 s->flags= avctx->flags;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
778 if (MPV_common_init(s) < 0) return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
779
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
780 init_vlc(&svq1_block_type, 2, 4,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
781 &ff_svq1_block_type_vlc[0][1], 2, 1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
782 &ff_svq1_block_type_vlc[0][0], 2, 1, 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
783
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
784 init_vlc(&svq1_motion_component, 7, 33,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
785 &mvtab[0][1], 2, 1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
786 &mvtab[0][0], 2, 1, 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
787
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
788 for (i = 0; i < 6; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
789 init_vlc(&svq1_intra_multistage[i], 3, 8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
790 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
791 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
792 init_vlc(&svq1_inter_multistage[i], 3, 8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
793 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
794 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
795 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
796
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
797 init_vlc(&svq1_intra_mean, 8, 256,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
798 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
799 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
800
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
801 init_vlc(&svq1_inter_mean, 9, 512,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
802 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
803 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
804
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
805 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
806 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
807
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
808 static av_cold int svq1_decode_end(AVCodecContext *avctx)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
809 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
810 MpegEncContext *s = avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
811
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
812 MPV_common_end(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
813 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
814 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
815
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
816
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
817 AVCodec svq1_decoder = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
818 "svq1",
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
819 CODEC_TYPE_VIDEO,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
820 CODEC_ID_SVQ1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
821 sizeof(MpegEncContext),
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
822 svq1_decode_init,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
823 NULL,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
824 svq1_decode_end,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
825 svq1_decode_frame,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
826 CODEC_CAP_DR1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
827 .flush= ff_mpeg_flush,
6788
e1302edb0f69 Replace some occurrences of -1 with PIX_FMT_NONE.
cehoyos
parents: 6712
diff changeset
828 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, PIX_FMT_NONE},
6712
5b3acf9fd50a Add long names to AVCodec declarations.
diego
parents: 6517
diff changeset
829 .long_name= "Sorenson Vector Quantizer 1",
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
830 };