1 /*
2 * ZeroCodec Decoder
3 *
4 * Copyright (c) 2012, Derek Buitenhuis
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <zlib.h>
20
24
29
32 {
36 z_stream *zstream = &zc->
zstream;
37 uint8_t *prev = prev_pic->
data[0];
38 uint8_t *dst;
40
44 } else {
45 if (!prev) {
48 }
49
51
54 }
55
56 zret = inflateReset(zstream);
57 if (zret != Z_OK) {
60 }
61
64
65 zstream->next_in = avpkt->
data;
66 zstream->avail_in = avpkt->
size;
67
69
70 /**
71 * ZeroCodec has very simple interframe compression. If a value
72 * is the same as the previous frame, set it to 0.
73 */
74
76 zstream->next_out = dst;
77 zstream->avail_out = avctx->
width << 1;
78
79 zret =
inflate(zstream, Z_SYNC_FLUSH);
80 if (zret != Z_OK && zret != Z_STREAM_END) {
82 "Inflate failed with return code: %d.\n", zret);
84 }
85
87 for (j = 0; j < avctx->
width << 1; j++)
88 dst[j] += prev[j] & -!dst[j];
89
92 }
93
97
98 *got_frame = 1;
99
101 }
102
104 {
106
108
110
111 return 0;
112 }
113
115 {
117 z_stream *zstream = &zc->
zstream;
118 int zret;
119
122
123 zstream->zalloc = Z_NULL;
124 zstream->zfree = Z_NULL;
125 zstream->opaque = Z_NULL;
126
127 zret = inflateInit(zstream);
128 if (zret != Z_OK) {
131 }
132
136
137 return 0;
138 }
139
141 {
143
145 }
146
149 .name = "zerocodec",
160 };