annotate svq1.c @ 2809:75400dfbe117 libavcodec

fixing colocated mv if colocated block is L1 predicted for the temporal direct case untested (none of the conformance streams laying around on my disk seems affected by this change)
author michael
date Wed, 27 Jul 2005 00:15:55 +0000
parents 0a8c847ad5e7
children 1c7921282a28
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
536
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
1 /*
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
2 *
536
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
3 * Copyright (C) 2002 the xine project
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
4 * Copyright (C) 2002 the ffmpeg project
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
5 *
536
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
6 * This library is free software; you can redistribute it and/or
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
8 * License as published by the Free Software Foundation; either
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
9 * version 2 of the License, or (at your option) any later version.
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
10 *
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
11 * This library is distributed in the hope that it will be useful,
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
536
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
14 * Lesser General Public License for more details.
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
15 *
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
17 * License along with this library; if not, write to the Free Software
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
19 *
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
20 * (SVQ1 Decoder)
537
8c696f0bcf50 Add Arpi to list of porters.
nickols_k
parents: 536
diff changeset
21 * Ported to mplayer by Arpi <arpi@thot.banki.hu>
536
6fac683d9997 Change licence to LGPL since there are no objections from side of original author
nickols_k
parents: 530
diff changeset
22 * Ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
23 *
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
24 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
25 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
26
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
27 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
28 * @file svq1.c
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
29 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
30 * For more information of the SVQ1 algorithm, visit:
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
31 * http://www.pcisys.net/~melanson/codecs/
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
32 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
33
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
34
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
35 //#define DEBUG_SVQ1
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
36 #include <stdio.h>
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
37 #include <stdlib.h>
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
38 #include <string.h>
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
39 #include <unistd.h>
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
40 #include <limits.h>
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
41
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
42 #include "common.h"
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
43 #include "avcodec.h"
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
44 #include "dsputil.h"
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
45 #include "mpegvideo.h"
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
46 #include "bswap.h"
551
b2e54bf843b8 faster get_bit_cache
michaelni
parents: 538
diff changeset
47
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
48 #undef NDEBUG
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
49 #include <assert.h>
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
50
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
51 extern const uint8_t mvtab[33][2];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
52
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
53 static VLC svq1_block_type;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
54 static VLC svq1_motion_component;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
55 static VLC svq1_intra_multistage[6];
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
56 static VLC svq1_inter_multistage[6];
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
57 static VLC svq1_intra_mean;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
58 static VLC svq1_inter_mean;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
59
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
60 #define SVQ1_BLOCK_SKIP 0
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
61 #define SVQ1_BLOCK_INTER 1
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
62 #define SVQ1_BLOCK_INTER_4V 2
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
63 #define SVQ1_BLOCK_INTRA 3
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
64
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
65 typedef struct SVQ1Context {
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
66 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX)
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
67 AVCodecContext *avctx;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
68 DSPContext dsp;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
69 AVFrame picture;
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
70 AVFrame current_picture;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
71 AVFrame last_picture;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
72 PutBitContext pb;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
73 GetBitContext gb;
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
74
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
75 PutBitContext reorder_pb[6]; //why ooh why this sick breadth first order, everything is slower and more complex
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
76
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
77 int frame_width;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
78 int frame_height;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
79
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
80 /* Y plane block dimensions */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
81 int y_block_width;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
82 int y_block_height;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
83
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
84 /* U & V plane (C planes) block dimensions */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
85 int c_block_width;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
86 int c_block_height;
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
87
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
88 uint16_t *mb_type;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
89 uint32_t *dummy;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
90 int16_t (*motion_val8[3])[2];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
91 int16_t (*motion_val16[3])[2];
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
92
2010
ad1a92c2db48 width height %64 != 0 fix
michael
parents: 2008
diff changeset
93 int64_t rd_total;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
94 } SVQ1Context;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
95
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
96 /* motion vector (prediction) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
97 typedef struct svq1_pmv_s {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
98 int x;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
99 int y;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
100 } svq1_pmv_t;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
101
579
ba17f7dbe745 moved codebooks to svq1_cb.h
al3x
parents: 561
diff changeset
102 #include "svq1_cb.h"
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
103 #include "svq1_vlc.h"
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
104
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
105 static const uint16_t checksum_table[256] = {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
106 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
107 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
108 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
109 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
110 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
111 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
112 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
113 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
114 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
115 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
116 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
117 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
118 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
119 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
120 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
121 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
122 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
123 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
124 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
125 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
126 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
127 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
128 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
129 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
130 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
131 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
132 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
133 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
134 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
135 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
136 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
137 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
138 };
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
139
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
140 static const uint8_t string_table[256] = {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
141 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
142 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
143 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
144 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
145 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
146 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
147 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
148 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
149 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
150 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
151 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
152 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
153 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
154 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
155 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
156 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
157 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
158 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
159 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
160 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
161 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
162 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
163 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
164 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
165 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
166 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
167 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
168 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
169 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
170 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
171 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
172 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
173 };
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
174
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
175 #define SVQ1_PROCESS_VECTOR()\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
176 for (; level > 0; i++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
177 /* process next depth */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
178 if (i == m) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
179 m = n;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
180 if (--level == 0)\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
181 break;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
182 }\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
183 /* divide block if next bit set */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
184 if (get_bits (bitbuf, 1) == 0)\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
185 break;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
186 /* add child nodes */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
187 list[n++] = list[i];\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
188 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
189 }
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
190
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
191 #define SVQ1_ADD_CODEBOOK()\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
192 /* add codebook entries to vector */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
193 for (j=0; j < stages; j++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
194 n3 = codebook[entries[j]] ^ 0x80808080;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
195 n1 += ((n3 & 0xFF00FF00) >> 8);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
196 n2 += (n3 & 0x00FF00FF);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
197 }\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
198 \
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
199 /* clip to [0..255] */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
200 if (n1 & 0xFF00FF00) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
201 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
202 n1 += 0x7F007F00;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
203 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
204 n1 &= (n3 & 0x00FF00FF);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
205 }\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
206 \
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
207 if (n2 & 0xFF00FF00) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
208 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
209 n2 += 0x7F007F00;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
210 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
211 n2 &= (n3 & 0x00FF00FF);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
212 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
213
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
214 #define SVQ1_DO_CODEBOOK_INTRA()\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
215 for (y=0; y < height; y++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
216 for (x=0; x < (width / 4); x++, codebook++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
217 n1 = n4;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
218 n2 = n4;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
219 SVQ1_ADD_CODEBOOK()\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
220 /* store result */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
221 dst[x] = (n1 << 8) | n2;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
222 }\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
223 dst += (pitch / 4);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
224 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
225
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
226 #define SVQ1_DO_CODEBOOK_NONINTRA()\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
227 for (y=0; y < height; y++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
228 for (x=0; x < (width / 4); x++, codebook++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
229 n3 = dst[x];\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
230 /* add mean value to vector */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
231 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
232 n2 = (n3 & 0x00FF00FF) + n4;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
233 SVQ1_ADD_CODEBOOK()\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
234 /* store result */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
235 dst[x] = (n1 << 8) | n2;\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
236 }\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
237 dst += (pitch / 4);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
238 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
239
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
240 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
862
058194d7ade6 * fixing some minor const warnings
kabi
parents: 853
diff changeset
241 codebook = (const uint32_t *) cbook[level];\
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
242 bit_cache = get_bits (bitbuf, 4*stages);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
243 /* calculate codebook entries for this vector */\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
244 for (j=0; j < stages; j++) {\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
245 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
246 }\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
247 mean -= (stages * 128);\
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
248 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
249
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
250 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
251 uint32_t bit_cache;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
252 uint8_t *list[63];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
253 uint32_t *dst;
862
058194d7ade6 * fixing some minor const warnings
kabi
parents: 853
diff changeset
254 const uint32_t *codebook;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
255 int entries[6];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
256 int i, j, m, n;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
257 int mean, stages;
862
058194d7ade6 * fixing some minor const warnings
kabi
parents: 853
diff changeset
258 unsigned x, y, width, height, level;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
259 uint32_t n1, n2, n3, n4;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
260
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
261 /* initialize list for breadth first processing of vectors */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
262 list[0] = pixels;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
263
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
264 /* recursively process vector */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
265 for (i=0, m=1, n=1, level=5; i < n; i++) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
266 SVQ1_PROCESS_VECTOR();
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
267
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
268 /* destination address and vector size */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
269 dst = (uint32_t *) list[i];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
270 width = 1 << ((4 + level) /2);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
271 height = 1 << ((3 + level) /2);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
272
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
273 /* get number of stages (-1 skips vector, 0 for mean only) */
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
274 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
275
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
276 if (stages == -1) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
277 for (y=0; y < height; y++) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
278 memset (&dst[y*(pitch / 4)], 0, width);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
279 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
280 continue; /* skip vector */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
281 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
282
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
283 if ((stages > 0) && (level >= 4)) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
284 #ifdef DEBUG_SVQ1
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
285 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
286 #endif
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
287 return -1; /* invalid vector */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
288 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
289
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
290 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
291
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
292 if (stages == 0) {
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
293 for (y=0; y < height; y++) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
294 memset (&dst[y*(pitch / 4)], mean, width);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
295 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
296 } else {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
297 SVQ1_CALC_CODEBOOK_ENTRIES(svq1_intra_codebooks);
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
298 SVQ1_DO_CODEBOOK_INTRA()
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
299 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
300 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
301
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
302 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
303 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
304
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
305 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
306 uint32_t bit_cache;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
307 uint8_t *list[63];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
308 uint32_t *dst;
862
058194d7ade6 * fixing some minor const warnings
kabi
parents: 853
diff changeset
309 const uint32_t *codebook;
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
310 int entries[6];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
311 int i, j, m, n;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
312 int mean, stages;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
313 int x, y, width, height, level;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
314 uint32_t n1, n2, n3, n4;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
315
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
316 /* initialize list for breadth first processing of vectors */
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
317 list[0] = pixels;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
318
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
319 /* recursively process vector */
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
320 for (i=0, m=1, n=1, level=5; i < n; i++) {
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
321 SVQ1_PROCESS_VECTOR();
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
322
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
323 /* destination address and vector size */
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
324 dst = (uint32_t *) list[i];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
325 width = 1 << ((4 + level) /2);
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
326 height = 1 << ((3 + level) /2);
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
327
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
328 /* get number of stages (-1 skips vector, 0 for mean only) */
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
329 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
330
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
331 if (stages == -1) continue; /* skip vector */
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
332
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
333 if ((stages > 0) && (level >= 4)) {
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
334 #ifdef DEBUG_SVQ1
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
335 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
336 #endif
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
337 return -1; /* invalid vector */
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
338 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
339
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
340 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
341
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
342 SVQ1_CALC_CODEBOOK_ENTRIES(svq1_inter_codebooks);
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
343 SVQ1_DO_CODEBOOK_NONINTRA()
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
344 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
345 return 0;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
346 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
347
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
348 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
349 int diff;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
350 int i;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
351
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
352 for (i=0; i < 2; i++) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
353
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
354 /* get motion code */
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
355 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
356 if(diff<0)
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
357 return -1;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
358 else if(diff){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
359 if(get_bits1(bitbuf)) diff= -diff;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
360 }
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
361
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
362 /* add median of motion vector predictors and clip result */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
363 if (i == 1)
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
364 mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
365 else
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
366 mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
367 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
368
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
369 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
370 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
371
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
372 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
373 uint8_t *src;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
374 uint8_t *dst;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
375 int i;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
376
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
377 src = &previous[x + y*pitch];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
378 dst = current;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
379
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
380 for (i=0; i < 16; i++) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
381 memcpy (dst, src, 16);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
382 src += pitch;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
383 dst += pitch;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
384 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
385 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
386
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
387 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
388 uint8_t *current, uint8_t *previous, int pitch,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
389 svq1_pmv_t *motion, int x, int y) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
390 uint8_t *src;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
391 uint8_t *dst;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
392 svq1_pmv_t mv;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
393 svq1_pmv_t *pmv[3];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
394 int result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
395
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
396 /* predict and decode motion vector */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
397 pmv[0] = &motion[0];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
398 if (y == 0) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
399 pmv[1] =
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
400 pmv[2] = pmv[0];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
401 }
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
402 else {
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
403 pmv[1] = &motion[(x / 8) + 2];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
404 pmv[2] = &motion[(x / 8) + 4];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
405 }
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
406
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
407 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
408
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
409 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
410 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
411
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
412 motion[0].x =
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
413 motion[(x / 8) + 2].x =
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
414 motion[(x / 8) + 3].x = mv.x;
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
415 motion[0].y =
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
416 motion[(x / 8) + 2].y =
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
417 motion[(x / 8) + 3].y = mv.y;
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
418
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
419 if(y + (mv.y >> 1)<0)
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
420 mv.y= 0;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
421 if(x + (mv.x >> 1)<0)
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
422 mv.x= 0;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
423
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
424 #if 0
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
425 int w= (s->width+15)&~15;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
426 int h= (s->height+15)&~15;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
427 if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
428 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
429 #endif
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
430
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
431 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
432 dst = current;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
433
853
eacc2dd8fd9d * using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents: 771
diff changeset
434 s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
435
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
436 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
437 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
438
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
439 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
440 uint8_t *current, uint8_t *previous, int pitch,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
441 svq1_pmv_t *motion,int x, int y) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
442 uint8_t *src;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
443 uint8_t *dst;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
444 svq1_pmv_t mv;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
445 svq1_pmv_t *pmv[4];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
446 int i, result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
447
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
448 /* predict and decode motion vector (0) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
449 pmv[0] = &motion[0];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
450 if (y == 0) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
451 pmv[1] =
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
452 pmv[2] = pmv[0];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
453 }
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
454 else {
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
455 pmv[1] = &motion[(x / 8) + 2];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
456 pmv[2] = &motion[(x / 8) + 4];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
457 }
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
458
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
459 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
460
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
461 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
462 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
463
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
464 /* predict and decode motion vector (1) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
465 pmv[0] = &mv;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
466 if (y == 0) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
467 pmv[1] =
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
468 pmv[2] = pmv[0];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
469 }
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
470 else {
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
471 pmv[1] = &motion[(x / 8) + 3];
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
472 }
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
473 result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
474
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
475 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
476 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
477
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
478 /* predict and decode motion vector (2) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
479 pmv[1] = &motion[0];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
480 pmv[2] = &motion[(x / 8) + 1];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
481
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
482 result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
483
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
484 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
485 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
486
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
487 /* predict and decode motion vector (3) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
488 pmv[2] = &motion[(x / 8) + 2];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
489 pmv[3] = &motion[(x / 8) + 3];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
490
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
491 result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
492
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
493 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
494 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
495
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
496 /* form predictions */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
497 for (i=0; i < 4; i++) {
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
498 int mvx= pmv[i]->x + (i&1)*16;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
499 int mvy= pmv[i]->y + (i>>1)*16;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
500
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
501 ///XXX /FIXME cliping or padding?
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
502 if(y + (mvy >> 1)<0)
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
503 mvy= 0;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
504 if(x + (mvx >> 1)<0)
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
505 mvx= 0;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
506
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
507 #if 0
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
508 int w= (s->width+15)&~15;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
509 int h= (s->height+15)&~15;
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
510 if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
511 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
512 #endif
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
513 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
514 dst = current;
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
515
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
516 s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
517
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
518 /* select next block */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
519 if (i & 1) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
520 current += 8*(pitch - 1);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
521 } else {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
522 current += 8;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
523 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
524 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
525
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
526 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
527 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
528
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
529 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
530 uint8_t *current, uint8_t *previous, int pitch,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
531 svq1_pmv_t *motion, int x, int y) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
532 uint32_t block_type;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
533 int result = 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
534
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
535 /* get block type */
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
536 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
537
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
538 /* reset motion vectors */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
539 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
540 motion[0].x =
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
541 motion[0].y =
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
542 motion[(x / 8) + 2].x =
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
543 motion[(x / 8) + 2].y =
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
544 motion[(x / 8) + 3].x =
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
545 motion[(x / 8) + 3].y = 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
546 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
547
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
548 switch (block_type) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
549 case SVQ1_BLOCK_SKIP:
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
550 svq1_skip_block (current, previous, pitch, x, y);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
551 break;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
552
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
553 case SVQ1_BLOCK_INTER:
853
eacc2dd8fd9d * using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents: 771
diff changeset
554 result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
555
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
556 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
557 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
558 #ifdef DEBUG_SVQ1
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
559 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
560 #endif
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
561 break;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
562 }
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
563 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
564 break;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
565
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
566 case SVQ1_BLOCK_INTER_4V:
853
eacc2dd8fd9d * using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents: 771
diff changeset
567 result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
568
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
569 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
570 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
571 #ifdef DEBUG_SVQ1
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
572 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
573 #endif
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
574 break;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
575 }
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
576 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
577 break;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
578
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
579 case SVQ1_BLOCK_INTRA:
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
580 result = svq1_decode_block_intra (bitbuf, current, pitch);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
581 break;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
582 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
583
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
584 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
585 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
586
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
587 /* standard video sizes */
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
588 static struct { int width; int height; } svq1_frame_size_table[8] = {
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
589 { 160, 120 }, { 128, 96 }, { 176, 144 }, { 352, 288 },
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
590 { 704, 576 }, { 240, 180 }, { 320, 240 }, { -1, -1 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
591 };
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
592
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
593 static uint16_t svq1_packet_checksum (uint8_t *data, int length, int value) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
594 int i;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
595
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
596 for (i=0; i < length; i++) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
597 value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
598 }
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
599
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
600 return value;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
601 }
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
602
2522
e25782262d7d kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 2453
diff changeset
603 #if 0 /* unused, remove? */
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
604 static uint16_t svq1_component_checksum (uint16_t *pixels, int pitch,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
605 int width, int height, int value) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
606 int x, y;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
607
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
608 for (y=0; y < height; y++) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
609 for (x=0; x < width; x++) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
610 value = checksum_table[pixels[x] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
611 }
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
612
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
613 pixels += pitch;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
614 }
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
615
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
616 return value;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
617 }
2522
e25782262d7d kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 2453
diff changeset
618 #endif
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
619
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
620 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
621 uint8_t seed;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
622 int i;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
623
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
624 out[0] = get_bits (bitbuf, 8);
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
625
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
626 seed = string_table[out[0]];
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
627
1714
033eeef90b2b off-by-1 error in the never-before-tested embedded string code
melanson
parents: 1598
diff changeset
628 for (i=1; i <= out[0]; i++) {
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
629 out[i] = get_bits (bitbuf, 8) ^ seed;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
630 seed = string_table[out[i] ^ seed];
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
631 }
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
632 }
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
633
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
634 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
635 int frame_size_code;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
636 int temporal_reference;
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
637
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
638 temporal_reference = get_bits (bitbuf, 8);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
639
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
640 /* frame type */
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
641 s->pict_type= get_bits (bitbuf, 2)+1;
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
642 if(s->pict_type==4)
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
643 return -1;
1049
6fadc19937b9 cliping MVs, i dunno if its correct but it looks better then without it
michaelni
parents: 1025
diff changeset
644
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
645 if (s->pict_type == I_TYPE) {
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
646
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
647 /* unknown fields */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
648 if (s->f_code == 0x50 || s->f_code == 0x60) {
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
649 int csum = get_bits (bitbuf, 16);
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
650
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
651 csum = svq1_packet_checksum ((uint8_t *)bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
652
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
653 // av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
654 // (csum == 0) ? "correct" : "incorrect", csum);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
655 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
656
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
657 if ((s->f_code ^ 0x10) >= 0x50) {
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
658 char msg[256];
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
659
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
660 svq1_parse_string (bitbuf, (char *) msg);
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
661
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1379
diff changeset
662 av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
663 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
664
1379
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
665 skip_bits (bitbuf, 2);
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
666 skip_bits (bitbuf, 2);
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
667 skip_bits1 (bitbuf);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
668
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
669 /* load frame size */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
670 frame_size_code = get_bits (bitbuf, 3);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
671
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
672 if (frame_size_code == 7) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
673 /* load width, height (12 bits each) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
674 s->width = get_bits (bitbuf, 12);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
675 s->height = get_bits (bitbuf, 12);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
676
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
677 if (!s->width || !s->height)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
678 return -1;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
679 } else {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
680 /* get width, height from table */
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
681 s->width = svq1_frame_size_table[frame_size_code].width;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
682 s->height = svq1_frame_size_table[frame_size_code].height;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
683 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
684 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
685
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
686 /* unknown fields */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
687 if (get_bits (bitbuf, 1) == 1) {
1379
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
688 skip_bits1 (bitbuf); /* use packet checksum if (1) */
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
689 skip_bits1 (bitbuf); /* component checksums after image data if (1) */
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
690
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
691 if (get_bits (bitbuf, 2) != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
692 return -1;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
693 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
694
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
695 if (get_bits (bitbuf, 1) == 1) {
1379
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
696 skip_bits1 (bitbuf);
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
697 skip_bits (bitbuf, 4);
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
698 skip_bits1 (bitbuf);
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
699 skip_bits (bitbuf, 2);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
700
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
701 while (get_bits (bitbuf, 1) == 1) {
1379
f0d3fdee007e get_bits -> skip_bits
al3x
parents: 1368
diff changeset
702 skip_bits (bitbuf, 8);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
703 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
704 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
705
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
706 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
707 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
708
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
709 static int svq1_decode_frame(AVCodecContext *avctx,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
710 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1049
diff changeset
711 uint8_t *buf, int buf_size)
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
712 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
713 MpegEncContext *s=avctx->priv_data;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
714 uint8_t *current, *previous;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
715 int result, i, x, y, width, height;
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 924
diff changeset
716 AVFrame *pict = data;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
717
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
718 /* initialize bit buffer */
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 982
diff changeset
719 init_get_bits(&s->gb,buf,buf_size*8);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
720
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
721 /* decode frame header */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
722 s->f_code = get_bits (&s->gb, 22);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
723
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
724 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
725 return -1;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
726
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
727 /* swap some header bytes (why?) */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
728 if (s->f_code != 0x20) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
729 uint32_t *src = (uint32_t *) (buf + 4);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
730
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
731 for (i=0; i < 4; i++) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
732 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
733 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
734 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
735
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
736 result = svq1_decode_frame_header (&s->gb, s);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
737
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
738 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
739 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
740 #ifdef DEBUG_SVQ1
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
741 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
742 #endif
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
743 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
744 }
561
2d5ae7516af0 hurry up support
michaelni
parents: 560
diff changeset
745
982
a1866d06df1e workaround dropable p frame after first frame bug
michaelni
parents: 925
diff changeset
746 //FIXME this avoids some confusion for "B frames" without 2 references
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
747 //this should be removed after libavcodec can handle more flexible picture types & ordering
1138
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1106
diff changeset
748 if(s->pict_type==B_TYPE && s->last_picture_ptr==NULL) return buf_size;
982
a1866d06df1e workaround dropable p frame after first frame bug
michaelni
parents: 925
diff changeset
749
561
2d5ae7516af0 hurry up support
michaelni
parents: 560
diff changeset
750 if(avctx->hurry_up && s->pict_type==B_TYPE) return buf_size;
2792
0a8c847ad5e7 skip_idct
michael
parents: 2522
diff changeset
751 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
0a8c847ad5e7 skip_idct
michael
parents: 2522
diff changeset
752 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
0a8c847ad5e7 skip_idct
michael
parents: 2522
diff changeset
753 || avctx->skip_frame >= AVDISCARD_ALL)
0a8c847ad5e7 skip_idct
michael
parents: 2522
diff changeset
754 return buf_size;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
755
903
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
756 if(MPV_frame_start(s, avctx) < 0)
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
757 return -1;
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
758
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
759 /* decode y, u and v components */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
760 for (i=0; i < 3; i++) {
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
761 int linesize;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
762 if (i == 0) {
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
763 width = (s->width+15)&~15;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
764 height = (s->height+15)&~15;
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
765 linesize= s->linesize;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
766 } else {
560
81227ab62678 grayscale only decoding
michaelni
parents: 557
diff changeset
767 if(s->flags&CODEC_FLAG_GRAY) break;
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
768 width = (s->width/4+15)&~15;
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
769 height = (s->height/4+15)&~15;
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
770 linesize= s->uvlinesize;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
771 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
772
903
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
773 current = s->current_picture.data[i];
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
774
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
775 if(s->pict_type==B_TYPE){
903
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
776 previous = s->next_picture.data[i];
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
777 }else{
903
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
778 previous = s->last_picture.data[i];
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
779 }
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
780
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
781 if (s->pict_type == I_TYPE) {
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
782 /* keyframe */
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
783 for (y=0; y < height; y+=16) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
784 for (x=0; x < width; x+=16) {
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
785 result = svq1_decode_block_intra (&s->gb, &current[x], linesize);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
786 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
787 {
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
788 //#ifdef DEBUG_SVQ1
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
789 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
790 //#endif
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
791 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
792 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
793 }
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
794 current += 16*linesize;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
795 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
796 } else {
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
797 svq1_pmv_t pmv[width/8+3];
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
798 /* delta frame */
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
799 memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv_t));
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
800
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
801 for (y=0; y < height; y+=16) {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
802 for (x=0; x < width; x+=16) {
853
eacc2dd8fd9d * using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents: 771
diff changeset
803 result = svq1_decode_delta_block (s, &s->gb, &current[x], previous,
eacc2dd8fd9d * using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents: 771
diff changeset
804 linesize, pmv, x, y);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
805 if (result != 0)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
806 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
807 #ifdef DEBUG_SVQ1
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
808 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
809 #endif
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
810 return result;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
811 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
812 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
813
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
814 pmv[0].x =
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
815 pmv[0].y = 0;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
816
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
817 current += 16*linesize;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
818 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
819 }
903
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
820 }
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
821
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 924
diff changeset
822 *pict = *(AVFrame*)&s->current_picture;
528
7f05b0eff4b9 * prefixication (due Kabi's request)
nickols_k
parents: 521
diff changeset
823
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
824
903
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
825 MPV_frame_end(s);
22ee74da2cd3 cleanup
michaelni
parents: 862
diff changeset
826
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 924
diff changeset
827 *data_size=sizeof(AVFrame);
561
2d5ae7516af0 hurry up support
michaelni
parents: 560
diff changeset
828 return buf_size;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
829 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
830
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
831 static int svq1_decode_init(AVCodecContext *avctx)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
832 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
833 MpegEncContext *s = avctx->priv_data;
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
834 int i;
579
ba17f7dbe745 moved codebooks to svq1_cb.h
al3x
parents: 561
diff changeset
835
1892
5ac49e7a1b8f init cleanup
michael
parents: 1754
diff changeset
836 MPV_decode_defaults(s);
5ac49e7a1b8f init cleanup
michael
parents: 1754
diff changeset
837
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
838 s->avctx = avctx;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
839 s->width = (avctx->width+3)&~3;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
840 s->height = (avctx->height+3)&~3;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
841 s->codec_id= avctx->codec->id;
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
842 avctx->pix_fmt = PIX_FMT_YUV410P;
924
3814e9115672 cleanup / messup?
michaelni
parents: 903
diff changeset
843 avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
844 s->flags= avctx->flags;
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
845 if (MPV_common_init(s) < 0) return -1;
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
846
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
847 init_vlc(&svq1_block_type, 2, 4,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
848 &svq1_block_type_vlc[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2268
diff changeset
849 &svq1_block_type_vlc[0][0], 2, 1, 1);
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
850
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
851 init_vlc(&svq1_motion_component, 7, 33,
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
852 &mvtab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2268
diff changeset
853 &mvtab[0][0], 2, 1, 1);
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
854
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
855 for (i = 0; i < 6; i++) {
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
856 init_vlc(&svq1_intra_multistage[i], 3, 8,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
857 &svq1_intra_multistage_vlc[i][0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2268
diff changeset
858 &svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
859 init_vlc(&svq1_inter_multistage[i], 3, 8,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
860 &svq1_inter_multistage_vlc[i][0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2268
diff changeset
861 &svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
862 }
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
863
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
864 init_vlc(&svq1_intra_mean, 8, 256,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
865 &svq1_intra_mean_vlc[0][1], 4, 2,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2268
diff changeset
866 &svq1_intra_mean_vlc[0][0], 4, 2, 1);
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
867
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
868 init_vlc(&svq1_inter_mean, 9, 512,
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
869 &svq1_inter_mean_vlc[0][1], 4, 2,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2268
diff changeset
870 &svq1_inter_mean_vlc[0][0], 4, 2, 1);
1283
00dcdda701ca rework SVQ1 decoder to use more intuitive VLC tables as well as ffmpeg's
tmmm
parents: 1282
diff changeset
871
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
872 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
873 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
874
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
875 static int svq1_decode_end(AVCodecContext *avctx)
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
876 {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
877 MpegEncContext *s = avctx->priv_data;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
878
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
879 MPV_common_end(s);
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
880 return 0;
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
881 }
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
882
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
883 static void svq1_write_header(SVQ1Context *s, int frame_type)
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
884 {
2214
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
885 int i;
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
886
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
887 /* frame code */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
888 put_bits(&s->pb, 22, 0x20);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
889
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
890 /* temporal reference (sure hope this is a "don't care") */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
891 put_bits(&s->pb, 8, 0x00);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
892
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
893 /* frame type */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
894 put_bits(&s->pb, 2, frame_type - 1);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
895
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
896 if (frame_type == I_TYPE) {
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
897
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
898 /* no checksum since frame code is 0x20 */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
899
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
900 /* no embedded string either */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
901
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
902 /* output 5 unknown bits (2 + 2 + 1) */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
903 put_bits(&s->pb, 5, 0);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
904
2214
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
905 for (i = 0; i < 7; i++)
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
906 {
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
907 if ((svq1_frame_size_table[i].width == s->frame_width) &&
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
908 (svq1_frame_size_table[i].height == s->frame_height))
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
909 {
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
910 put_bits(&s->pb, 3, i);
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
911 break;
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
912 }
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
913 }
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
914
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
915 if (i == 7)
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
916 {
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
917 put_bits(&s->pb, 3, 7);
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
918 put_bits(&s->pb, 12, s->frame_width);
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
919 put_bits(&s->pb, 12, s->frame_height);
de5ed621effc try to select w/h from tables
alex
parents: 2153
diff changeset
920 }
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
921 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
922
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
923 /* no checksum or extra data (next 2 bits get 0) */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
924 put_bits(&s->pb, 2, 0);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
925 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
926
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
927
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
928 #define QUALITY_THRESHOLD 100
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
929 #define THRESHOLD_MULTIPLIER 0.6
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
930
2069
a8100a516b0a gcc bug workaround by (Jonathan Gray <khalek at linuxgamers dot net>)
michael
parents: 2028
diff changeset
931 #if defined(HAVE_ALTIVEC)
a8100a516b0a gcc bug workaround by (Jonathan Gray <khalek at linuxgamers dot net>)
michael
parents: 2028
diff changeset
932 #undef vector
a8100a516b0a gcc bug workaround by (Jonathan Gray <khalek at linuxgamers dot net>)
michael
parents: 2028
diff changeset
933 #endif
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
934
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
935 static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref, uint8_t *decoded, int stride, int level, int threshold, int lambda, int intra){
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
936 int count, y, x, i, j, split, best_mean, best_score, best_count;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
937 int best_vector[6];
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
938 int block_sum[7]= {0, 0, 0, 0, 0, 0};
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
939 int w= 2<<((level+2)>>1);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
940 int h= 2<<((level+1)>>1);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
941 int size=w*h;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
942 int16_t block[7][256];
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
943 const int8_t *codebook_sum, *codebook;
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
944 const uint16_t (*mean_vlc)[2];
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
945 const uint8_t (*multistage_vlc)[2];
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
946
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
947 best_score=0;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
948 //FIXME optimize, this doenst need to be done multiple times
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
949 if(intra){
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
950 codebook_sum= svq1_intra_codebook_sum[level];
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
951 codebook= svq1_intra_codebooks[level];
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
952 mean_vlc= svq1_intra_mean_vlc;
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
953 multistage_vlc= svq1_intra_multistage_vlc[level];
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
954 for(y=0; y<h; y++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
955 for(x=0; x<w; x++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
956 int v= src[x + y*stride];
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
957 block[0][x + w*y]= v;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
958 best_score += v*v;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
959 block_sum[0] += v;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
960 }
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
961 }
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
962 }else{
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
963 codebook_sum= svq1_inter_codebook_sum[level];
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
964 codebook= svq1_inter_codebooks[level];
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
965 mean_vlc= svq1_inter_mean_vlc + 256;
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
966 multistage_vlc= svq1_inter_multistage_vlc[level];
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
967 for(y=0; y<h; y++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
968 for(x=0; x<w; x++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
969 int v= src[x + y*stride] - ref[x + y*stride];
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
970 block[0][x + w*y]= v;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
971 best_score += v*v;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
972 block_sum[0] += v;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
973 }
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
974 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
975 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
976
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
977 best_count=0;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
978 best_score -= ((block_sum[0]*block_sum[0])>>(level+3));
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
979 best_mean= (block_sum[0] + (size>>1)) >> (level+3);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
980
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
981 if(level<4){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
982 for(count=1; count<7; count++){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
983 int best_vector_score= INT_MAX;
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
984 int best_vector_sum=-999, best_vector_mean=-999;
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
985 const int stage= count-1;
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
986 const int8_t *vector;
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
987
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
988 for(i=0; i<16; i++){
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
989 int sum= codebook_sum[stage*16 + i];
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
990 int sqr=0;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
991 int diff, mean, score;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
992
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
993 vector = codebook + stage*size*16 + i*size;
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
994
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
995 for(j=0; j<size; j++){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
996 int v= vector[j];
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
997 sqr += (v - block[stage][j])*(v - block[stage][j]);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
998 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
999 diff= block_sum[stage] - sum;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1000 mean= (diff + (size>>1)) >> (level+3);
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1001 assert(mean >-300 && mean<300);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1002 if(intra) mean= clip(mean, 0, 255);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1003 else mean= clip(mean, -256, 255);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1004 score= sqr - ((diff*(int64_t)diff)>>(level+3)); //FIXME 64bit slooow
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1005 if(score < best_vector_score){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1006 best_vector_score= score;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1007 best_vector[stage]= i;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1008 best_vector_sum= sum;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1009 best_vector_mean= mean;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1010 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1011 }
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1012 assert(best_vector_mean != -999);
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1013 vector= codebook + stage*size*16 + best_vector[stage]*size;
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1014 for(j=0; j<size; j++){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1015 block[stage+1][j] = block[stage][j] - vector[j];
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1016 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1017 block_sum[stage+1]= block_sum[stage] - best_vector_sum;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1018 best_vector_score +=
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1019 lambda*(+ 1 + 4*count
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1020 + multistage_vlc[1+count][1]
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1021 + mean_vlc[best_vector_mean][1]);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1022
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1023 if(best_vector_score < best_score){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1024 best_score= best_vector_score;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1025 best_count= count;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1026 best_mean= best_vector_mean;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1027 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1028 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1029 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1030
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1031 split=0;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1032 if(best_score > threshold && level){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1033 int score=0;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1034 int offset= (level&1) ? stride*h/2 : w/2;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1035 PutBitContext backup[6];
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1036
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1037 for(i=level-1; i>=0; i--){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1038 backup[i]= s->reorder_pb[i];
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1039 }
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1040 score += encode_block(s, src , ref , decoded , stride, level-1, threshold>>1, lambda, intra);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1041 score += encode_block(s, src + offset, ref + offset, decoded + offset, stride, level-1, threshold>>1, lambda, intra);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1042 score += lambda;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1043
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1044 if(score < best_score){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1045 best_score= score;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1046 split=1;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1047 }else{
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1048 for(i=level-1; i>=0; i--){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1049 s->reorder_pb[i]= backup[i];
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1050 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1051 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1052 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1053 if (level > 0)
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1054 put_bits(&s->reorder_pb[level], 1, split);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1055
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1056 if(!split){
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1057 assert((best_mean >= 0 && best_mean<256) || !intra);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1058 assert(best_mean >= -256 && best_mean<256);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1059 assert(best_count >=0 && best_count<7);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1060 assert(level<4 || best_count==0);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1061
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1062 /* output the encoding */
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1063 put_bits(&s->reorder_pb[level],
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1064 multistage_vlc[1 + best_count][1],
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1065 multistage_vlc[1 + best_count][0]);
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1066 put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1067 mean_vlc[best_mean][0]);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1068
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1069 for (i = 0; i < best_count; i++){
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1070 assert(best_vector[i]>=0 && best_vector[i]<16);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1071 put_bits(&s->reorder_pb[level], 4, best_vector[i]);
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1072 }
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1073
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1074 for(y=0; y<h; y++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1075 for(x=0; x<w; x++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1076 decoded[x + y*stride]= src[x + y*stride] - block[best_count][x + w*y] + best_mean;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1077 }
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1078 }
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1079 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1080
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1081 return best_score;
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1082 }
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1083
2077
00ba706bc844 the ongoing struggle for encoding conditionals
melanson
parents: 2069
diff changeset
1084 #ifdef CONFIG_ENCODERS
00ba706bc844 the ongoing struggle for encoding conditionals
melanson
parents: 2069
diff changeset
1085
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1086 static int svq1_encode_plane(SVQ1Context *s, int plane, unsigned char *src_plane, unsigned char *ref_plane, unsigned char *decoded_plane,
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1087 int width, int height, int src_stride, int stride)
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1088 {
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1089 int x, y;
2021
779dbab120d5 removing unused encoding code
michael
parents: 2020
diff changeset
1090 int i;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1091 int block_width, block_height;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1092 int level;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1093 int threshold[6];
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1094 const int lambda= (s->picture.quality*s->picture.quality) >> (2*FF_LAMBDA_SHIFT);
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1095
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1096 /* figure out the acceptable level thresholds in advance */
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1097 threshold[5] = QUALITY_THRESHOLD;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1098 for (level = 4; level >= 0; level--)
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1099 threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1100
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1101 block_width = (width + 15) / 16;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1102 block_height = (height + 15) / 16;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1103
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1104 if(s->picture.pict_type == P_TYPE){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1105 s->m.avctx= s->avctx;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1106 s->m.current_picture_ptr= &s->m.current_picture;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1107 s->m.last_picture_ptr = &s->m.last_picture;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1108 s->m.last_picture.data[0]= ref_plane;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1109 s->m.linesize=
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1110 s->m.last_picture.linesize[0]=
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1111 s->m.new_picture.linesize[0]=
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1112 s->m.current_picture.linesize[0]= stride;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1113 s->m.width= width;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1114 s->m.height= height;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1115 s->m.mb_width= block_width;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1116 s->m.mb_height= block_height;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1117 s->m.mb_stride= s->m.mb_width+1;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1118 s->m.b8_stride= 2*s->m.mb_width+1;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1119 s->m.f_code=1;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1120 s->m.pict_type= s->picture.pict_type;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1121 s->m.qscale= s->picture.quality/FF_QP2LAMBDA;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1122 s->m.me_method= s->avctx->me_method;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1123
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1124 if(!s->motion_val8[plane]){
2153
e0d88f21d864 svq1 mv array size fix
michael
parents: 2145
diff changeset
1125 s->motion_val8 [plane]= av_mallocz((s->m.b8_stride*block_height*2 + 2)*2*sizeof(int16_t));
e0d88f21d864 svq1 mv array size fix
michael
parents: 2145
diff changeset
1126 s->motion_val16[plane]= av_mallocz((s->m.mb_stride*(block_height + 2) + 1)*2*sizeof(int16_t));
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1127 }
2153
e0d88f21d864 svq1 mv array size fix
michael
parents: 2145
diff changeset
1128
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1129 s->m.mb_type= s->mb_type;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1130
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1131 //dummies, to avoid segfaults
2021
779dbab120d5 removing unused encoding code
michael
parents: 2020
diff changeset
1132 s->m.current_picture.mb_mean= (uint8_t *)s->dummy;
779dbab120d5 removing unused encoding code
michael
parents: 2020
diff changeset
1133 s->m.current_picture.mb_var= (uint16_t*)s->dummy;
779dbab120d5 removing unused encoding code
michael
parents: 2020
diff changeset
1134 s->m.current_picture.mc_mb_var= (uint16_t*)s->dummy;
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1135 s->m.current_picture.mb_type= s->dummy;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1136
2153
e0d88f21d864 svq1 mv array size fix
michael
parents: 2145
diff changeset
1137 s->m.current_picture.motion_val[0]= s->motion_val8[plane] + 2;
e0d88f21d864 svq1 mv array size fix
michael
parents: 2145
diff changeset
1138 s->m.p_mv_table= s->motion_val16[plane] + s->m.mb_stride + 1;
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1139 s->m.dsp= s->dsp; //move
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1140 ff_init_me(&s->m);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1141
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1142 s->m.me.dia_size= s->avctx->dia_size;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1143 s->m.first_slice_line=1;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1144 for (y = 0; y < block_height; y++) {
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1145 uint8_t src[stride*16];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1146
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1147 s->m.new_picture.data[0]= src - y*16*stride; //ugly
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1148 s->m.mb_y= y;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1149
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1150 for(i=0; i<16 && i + 16*y<height; i++){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1151 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1152 for(x=width; x<16*block_width; x++)
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1153 src[i*stride+x]= src[i*stride+x-1];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1154 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1155 for(; i<16 && i + 16*y<16*block_height; i++)
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1156 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1157
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1158 for (x = 0; x < block_width; x++) {
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1159 s->m.mb_x= x;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1160 ff_init_block_index(&s->m);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1161 ff_update_block_index(&s->m);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1162
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1163 ff_estimate_p_frame_motion(&s->m, x, y);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1164 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1165 s->m.first_slice_line=0;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1166 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1167
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1168 ff_fix_long_p_mvs(&s->m);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1169 ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code, CANDIDATE_MB_TYPE_INTER, 0);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1170 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1171
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1172 s->m.first_slice_line=1;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1173 for (y = 0; y < block_height; y++) {
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1174 uint8_t src[stride*16];
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1175
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1176 for(i=0; i<16 && i + 16*y<height; i++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1177 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1178 for(x=width; x<16*block_width; x++)
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1179 src[i*stride+x]= src[i*stride+x-1];
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1180 }
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1181 for(; i<16 && i + 16*y<16*block_height; i++)
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1182 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1183
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1184 s->m.mb_y= y;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1185 for (x = 0; x < block_width; x++) {
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1186 uint8_t reorder_buffer[3][6][7*32];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1187 int count[3][6];
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1188 int offset = y * 16 * stride + x * 16;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1189 uint8_t *decoded= decoded_plane + offset;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1190 uint8_t *ref= ref_plane + offset;
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1191 int score[4]={0,0,0,0}, best;
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1192 uint8_t temp[16*stride];
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1193
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1194 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 3000){ //FIXME check size
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1195 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1196 return -1;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1197 }
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1198
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1199 s->m.mb_x= x;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1200 ff_init_block_index(&s->m);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1201 ff_update_block_index(&s->m);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1202
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1203 if(s->picture.pict_type == I_TYPE || (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTRA)){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1204 for(i=0; i<6; i++){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1205 init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i], 7*32);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1206 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1207 if(s->picture.pict_type == P_TYPE){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1208 const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTRA];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1209 put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1210 score[0]= vlc[1]*lambda;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1211 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1212 score[0]+= encode_block(s, src+16*x, NULL, temp, stride, 5, 64, lambda, 1);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1213 for(i=0; i<6; i++){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1214 count[0][i]= put_bits_count(&s->reorder_pb[i]);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1215 flush_put_bits(&s->reorder_pb[i]);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1216 }
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1217 }else
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1218 score[0]= INT_MAX;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1219
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1220 best=0;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1221
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1222 if(s->picture.pict_type == P_TYPE){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1223 const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTER];
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1224 int mx, my, pred_x, pred_y, dxy;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1225 int16_t *motion_ptr;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1226
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1227 motion_ptr= h263_pred_motion(&s->m, 0, 0, &pred_x, &pred_y);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1228 if(s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1229 for(i=0; i<6; i++)
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1230 init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i], 7*32);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1231
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1232 put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1233
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1234 s->m.pb= s->reorder_pb[5];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1235 mx= motion_ptr[0];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1236 my= motion_ptr[1];
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1237 assert(mx>=-32 && mx<=31);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1238 assert(my>=-32 && my<=31);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1239 assert(pred_x>=-32 && pred_x<=31);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1240 assert(pred_y>=-32 && pred_y<=31);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1241 ff_h263_encode_motion(&s->m, mx - pred_x, 1);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1242 ff_h263_encode_motion(&s->m, my - pred_y, 1);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1243 s->reorder_pb[5]= s->m.pb;
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1244 score[1] += lambda*put_bits_count(&s->reorder_pb[5]);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1245
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1246 dxy= (mx&1) + 2*(my&1);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1247
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1248 s->dsp.put_pixels_tab[0][dxy](temp+16, ref + (mx>>1) + stride*(my>>1), stride, 16);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1249
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1250 score[1]+= encode_block(s, src+16*x, temp+16, decoded, stride, 5, 64, lambda, 0);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1251 best= score[1] <= score[0];
2018
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1252
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1253 vlc= svq1_block_type_vlc[SVQ1_BLOCK_SKIP];
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1254 score[2]= s->dsp.sse[0](NULL, src+16*x, ref, stride, 16);
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1255 score[2]+= vlc[1]*lambda;
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1256 if(score[2] < score[best] && mx==0 && my==0){
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1257 best=2;
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1258 s->dsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1259 for(i=0; i<6; i++){
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1260 count[2][i]=0;
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1261 }
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1262 put_bits(&s->pb, vlc[1], vlc[0]);
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1263 }
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1264 }
2018
552ae05eb513 support skiped blocks in SVQ1
michael
parents: 2017
diff changeset
1265
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1266 if(best==1){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1267 for(i=0; i<6; i++){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1268 count[1][i]= put_bits_count(&s->reorder_pb[i]);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1269 flush_put_bits(&s->reorder_pb[i]);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1270 }
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1271 }else{
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1272 motion_ptr[0 ] = motion_ptr[1 ]=
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1273 motion_ptr[2 ] = motion_ptr[3 ]=
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1274 motion_ptr[0+2*s->m.b8_stride] = motion_ptr[1+2*s->m.b8_stride]=
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1275 motion_ptr[2+2*s->m.b8_stride] = motion_ptr[3+2*s->m.b8_stride]=0;
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1276 }
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1277 }
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1278
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1279 s->rd_total += score[best];
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1280
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1281 for(i=5; i>=0; i--){
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1282 ff_copy_bits(&s->pb, reorder_buffer[best][i], count[best][i]);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1283 }
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1284 if(best==0){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1285 s->dsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
2007
5be94affdb14 rate distorted intra only encoding
michael
parents: 2005
diff changeset
1286 }
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1287 }
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1288 s->m.first_slice_line=0;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1289 }
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1290 return 0;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1291 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1292
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1293 static int svq1_encode_init(AVCodecContext *avctx)
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1294 {
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1295 SVQ1Context * const s = avctx->priv_data;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1296
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1297 dsputil_init(&s->dsp, avctx);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1298 avctx->coded_frame= (AVFrame*)&s->picture;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1299
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1300 s->frame_width = avctx->width;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1301 s->frame_height = avctx->height;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1302
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1303 s->y_block_width = (s->frame_width + 15) / 16;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1304 s->y_block_height = (s->frame_height + 15) / 16;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1305
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1306 s->c_block_width = (s->frame_width / 4 + 15) / 16;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1307 s->c_block_height = (s->frame_height / 4 + 15) / 16;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1308
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1309 s->avctx= avctx;
2268
5b3dfc4103b9 10l (segfault)
michael
parents: 2214
diff changeset
1310 s->m.avctx= avctx;
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1311 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1312 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1313 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1314 s->mb_type = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int16_t));
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1315 s->dummy = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int32_t));
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1316 h263_encode_init(&s->m); //mv_penalty
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1317
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1318 return 0;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1319 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1320
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1321 static int svq1_encode_frame(AVCodecContext *avctx, unsigned char *buf,
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1322 int buf_size, void *data)
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1323 {
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1324 SVQ1Context * const s = avctx->priv_data;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1325 AVFrame *pict = data;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1326 AVFrame * const p= (AVFrame*)&s->picture;
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1327 AVFrame temp;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1328 int i;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1329
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1330 if(avctx->pix_fmt != PIX_FMT_YUV410P){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1331 av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1332 return -1;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1333 }
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1334
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1335 if(!s->current_picture.data[0]){
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1336 avctx->get_buffer(avctx, &s->current_picture);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1337 avctx->get_buffer(avctx, &s->last_picture);
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1338 }
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1339
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1340 temp= s->current_picture;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1341 s->current_picture= s->last_picture;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1342 s->last_picture= temp;
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1343
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1344 init_put_bits(&s->pb, buf, buf_size);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1345
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1346 *p = *pict;
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1347 p->pict_type = avctx->frame_number % avctx->gop_size ? P_TYPE : I_TYPE;
2011
8c7e7c332b86 using pointers so the code could eventually be used for P frames
michael
parents: 2010
diff changeset
1348 p->key_frame = p->pict_type == I_TYPE;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1349
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1350 svq1_write_header(s, p->pict_type);
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1351 for(i=0; i<3; i++){
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1352 if(svq1_encode_plane(s, i,
2012
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1353 s->picture.data[i], s->last_picture.data[i], s->current_picture.data[i],
b7c82b9ef098 p frame encoding, only with 0,0 motion vectors yet though
michael
parents: 2011
diff changeset
1354 s->frame_width / (i?4:1), s->frame_height / (i?4:1),
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1355 s->picture.linesize[i], s->current_picture.linesize[i]) < 0)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
1356 return -1;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1357 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1358
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1359 // align_put_bits(&s->pb);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1360 while(put_bits_count(&s->pb) & 31)
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1361 put_bits(&s->pb, 1, 0);
2008
fc54b7be8448 color and 10l
michael
parents: 2007
diff changeset
1362
fc54b7be8448 color and 10l
michael
parents: 2007
diff changeset
1363 flush_put_bits(&s->pb);
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1364
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1365 return (put_bits_count(&s->pb) / 8);
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1366 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1367
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1368 static int svq1_encode_end(AVCodecContext *avctx)
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1369 {
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1370 SVQ1Context * const s = avctx->priv_data;
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1371 int i;
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1372
2010
ad1a92c2db48 width height %64 != 0 fix
michael
parents: 2008
diff changeset
1373 av_log(avctx, AV_LOG_DEBUG, "RD: %f\n", s->rd_total/(double)(avctx->width*avctx->height*avctx->frame_number));
ad1a92c2db48 width height %64 != 0 fix
michael
parents: 2008
diff changeset
1374
2017
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1375 av_freep(&s->m.me.scratchpad);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1376 av_freep(&s->m.me.map);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1377 av_freep(&s->m.me.score_map);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1378 av_freep(&s->mb_type);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1379 av_freep(&s->dummy);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1380
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1381 for(i=0; i<3; i++){
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1382 av_freep(&s->motion_val8[i]);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1383 av_freep(&s->motion_val16[i]);
f089d25c82f0 motion estimation for SVQ1
michael
parents: 2012
diff changeset
1384 }
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1385
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1386 return 0;
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1387 }
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1388
2077
00ba706bc844 the ongoing struggle for encoding conditionals
melanson
parents: 2069
diff changeset
1389 #endif //CONFIG_ENCODERS
00ba706bc844 the ongoing struggle for encoding conditionals
melanson
parents: 2069
diff changeset
1390
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1391 AVCodec svq1_decoder = {
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1392 "svq1",
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1393 CODEC_TYPE_VIDEO,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1394 CODEC_ID_SVQ1,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1395 sizeof(MpegEncContext),
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1396 svq1_decode_init,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1397 NULL,
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1398 svq1_decode_end,
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
1399 svq1_decode_frame,
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 555
diff changeset
1400 CODEC_CAP_DR1,
1368
0fd38b711f06 AVCodec.flush()
michaelni
parents: 1283
diff changeset
1401 .flush= ff_mpeg_flush,
2020
a14873a809a8 automatic pixel format selection
michael
parents: 2019
diff changeset
1402 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
521
9c66b5183ab3 new codec: Sorenson v1
nickols_k
parents:
diff changeset
1403 };
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1404
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1405 #ifdef CONFIG_ENCODERS
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1406
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1407 AVCodec svq1_encoder = {
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1408 "svq1",
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1409 CODEC_TYPE_VIDEO,
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1410 CODEC_ID_SVQ1,
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1411 sizeof(SVQ1Context),
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1412 svq1_encode_init,
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1413 svq1_encode_frame,
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1414 svq1_encode_end,
2020
a14873a809a8 automatic pixel format selection
michael
parents: 2019
diff changeset
1415 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
2005
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1416 };
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1417
28d3f73aa254 first pass at a Sorenson Video 1 (SVQ1) encoder
melanson
parents: 1892
diff changeset
1418 #endif //CONFIG_ENCODERS