forked from cellularmitosis/ADC-reference-library-2009-july
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlisting16.html
More file actions
executable file
·240 lines (211 loc) · 10.5 KB
/
Copy pathlisting16.html
File metadata and controls
executable file
·240 lines (211 loc) · 10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>ExampleIPBCodec - /ReadMe-ExampleIPBCodec.txt</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/QuickTime/index.html">QuickTime</a> > <a href="../../samplecode/QuickTime/idxCompressionDecompression-date.html">Compression & Decompression</a> > <A HREF="javascript:location.replace('index.html');">ExampleIPBCodec</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">ExampleIPBCodec</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/ReadMe-ExampleIPBCodec.txt</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/ExampleIPBCodec.r</option>
<option value="listing2.html">/ExampleIPBCodecUniversal.r</option>
<option value="listing3.html">/ExampleIPBCodecVersion.h</option>
<option value="listing4.html">/ExampleIPBCompressor.c</option>
<option value="listing5.html">/ExampleIPBCompressorDispatch.h</option>
<option value="listing6.html">/ExampleIPBDecompressor.c</option>
<option value="listing7.html">/ExampleIPBDecompressorDispatch.h</option>
<option value="listing8.html">/NaiveDecoder.c</option>
<option value="listing9.html">/NaiveDecoder.h</option>
<option value="listing10.html">/NaiveEncoder.c</option>
<option value="listing11.html">/NaiveEncoder.h</option>
<option value="listing12.html">/NaiveFormat.c</option>
<option value="listing13.html">/NaiveFormat.h</option>
<option value="listing14.html">/PixelUtilities.c</option>
<option value="listing15.html">/PixelUtilities.h</option>
<option value="listing16.html">/ReadMe-ExampleIPBCodec.txt</option></select>
</p>
</form>
<p><strong><a href="ExampleIPBCodec.zip">Download Sample</a></strong> (“ExampleIPBCodec.zip”, 81.3K)<BR>
<strong><a href="ExampleIPBCodec.dmg">Download Sample</a></strong> (“ExampleIPBCodec.dmg”, 128.2K)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">ExampleIPBCodec
Version 1.0
Xcode 2.1 project builds universal binary.
This sample code shows how to write a modern video compressor component
and decompressor component pair for QuickTime 7. The compressor and
decompressor support a IPB frame pattern, which means that the
compressor is allowed to reorder frames to help improve compression
quality.
To use this sample, drag "ExampleIPBCodec.component" into the
/Library/QuickTime folder. Then you will see "ExampleIPB" in the
compressor list in the Export to QuickTime Movie video settings dialog
in QuickTime Player Pro and other applications.
In the interests of simplicity, we have deliberately chosen a very naive
encoding format, but one which allows a lossy quality-vs-bitrate
tradeoff.
Basically, the format is based on rearranging the bits of image pixels
so that the corresponding bits of each byte in an 8x8 block are grouped
together. Priority is given to the most significant bits; when the
bit-rate budget is reached, remaining bits are left alone. So when
encoding the number 0xFF, if we only have enough budget to encode five
bits, we'll end up reconstructing it as the number 0xF8.
In I frames, the bits left alone are zero. P frames use the previous I
or P frame as a starting point; if the high bits of an 8x8 block match
that previous frame, they don't need to be encoded again. Subsequent
bits that don't match are encoded as the difference (XOR) from the
starting frame. B frames can use 8x8 blocks from the previous two I or
P frames as a starting point, selecting on a block-by-block basis. The
codec does not perform motion compensation.
This does not represent the state of the art in encoding! In fact, the
quality is downright lousy unless you set a very high bit rate. On the
other hand, from an educational perspective, the loss in quality is
highly visible, because it causes pixel values to be rounded down,
causing blocks to be made darker (and greener, since the rounding
happens in YCbCr). (This helps illustrate, for example, that B frames
achieve better quality for the same bit-rate than I or P frames alone,
since the B frames in compressed movies look best -- and in this simple
codec all frames are given the same bit budget.)
No effort has been made to optimize either the compressor or
decompressor.
The codec uses a planar YUV 4:2:0 format internally. The compressor
converts source frames from chunky YUV 4:2:2 to planar YUV 4:2:0, and
the decompressor does the reverse conversion. (A feature of the new
compressor component interface is the ability for compressors to request
that they always receive YUV 4:2:2 input.)
The compressor uses the familiar MPEG-2 IPB frame pattern. However,
compressor components may use more generalized and flexible frame
patterns. For example, you can allow more than 2 previous I and P
frames to be used by a B frame by increasing kMaxStoredFrames in
NaiveFormat.h. More complex frame dependency and frame reordering
patterns can be created by modifying encodeSomeSourceFrames in
ExampleIPBCompressor.c.
The basic model for "new-style" video compressor components introduced
in QuickTime 7 is:
* The ICM sets up the compressor component by calling its
ImageCodecPrepareToCompressFrames function. This function should
create and return a dictionary describing desired characteristics of
source pixel buffers. It should also record the "compressor session",
which is its reference token when calling back into the ICM (not to be
confused with the "compression session", which is the client's
reference token). It should retain the session options object for
later reference, and it may modify the image description if desired.
* Source frames are provided to the compressor component through calls
to its ImageCodecEncodeFrame function.
* The compressor allocates buffers to hold encoded frames by calling
ICMEncodedFrameCreateMutable and fills in the data size, sample flags,
and frame type as applicable. It emits encoded frames in decode order
(the order in which frames will be presented to the decompressor) by
calling ICMCompressorSessionEmitEncodedFrame.
* The ImageCodecEncodeFrame function is not required to emit frames
before returning; the compressor component may maintain a lookahead
queue of source frames. (ExampleIPBCodec uses a C array, but you can
use CFArray, STL, or whatever.)
* The compressor component's ImageCodecCompleteFrame function may be
called to demand that it complete encoding of a given frame. The
frame does not necessarily need to be the first frame emitted, but
it must be emitted (or dropped) before the function returns.
Documentation about individual compressor component functions can be found
in the header file ImageCompression.h.
</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/ExampleIPBCodec/listing16.html%3Fid%3DDTS10003589-1.0&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/ExampleIPBCodec/listing16.html%3Fid%3DDTS10003589-1.0&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/ExampleIPBCodec/listing16.html%3Fid%3DDTS10003589-1.0&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>