Skip to content

Commit a8a3a07

Browse files
committed
Granule position setting tests
1 parent 957b513 commit a8a3a07

2 files changed

Lines changed: 73 additions & 2 deletions

File tree

core/src/main/java/org/gagravarr/ogg/OggPacketWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ public void bufferPacket(OggPacket packet, long granulePosition) {
106106
if(pos < size) {
107107
page = getCurrentPage(true);
108108
page.setIsContinuation();
109-
page.setGranulePosition(granulePosition);
110109
}
110+
page.setGranulePosition(granulePosition);
111111
emptyPacket = false;
112112
}
113-
page.setGranulePosition(granulePosition);
113+
currentGranulePosition = granulePosition;
114114
packet.setParent(page);
115115
}
116116

core/src/test/java/org/gagravarr/ogg/TestWriteBoundaries.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,75 @@ public void testWriteBigPackets() throws Exception {
164164
p = r.getNextPacket();
165165
assertEquals(null, p);
166166
}
167+
168+
public void testGranulePosition() throws Exception {
169+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
170+
OggFile ogg = new OggFile(baos);
171+
OggPacketWriter w = ogg.getPacketWriter(0x123456);
172+
173+
OggPacket p;
174+
175+
// First packet will be at 0, as that's the default
176+
p = new OggPacket(new byte[] {
177+
0, 1, 2, 3, 4, 5
178+
});
179+
w.bufferPacket(p, true);
180+
assertEquals(0, p._getParent().getGranulePosition());
181+
182+
// One without buffering can be changed with a subsequent
183+
// set before a flush
184+
p = new OggPacket(getBytes(131072)); // 2-and-a-bit pages
185+
w.bufferPacket(p);
186+
assertEquals(0, p._getParent().getGranulePosition());
187+
w.setGranulePosition(0x1111l);
188+
assertEquals(0x1111l, p._getParent().getGranulePosition());
189+
w.setGranulePosition(0x12345l);
190+
assertEquals(0x12345l, p._getParent().getGranulePosition());
191+
w.flush();
192+
193+
// If we set the granule as we go, the last set on
194+
// a given page wins
195+
p = new OggPacket(getBytes(15));
196+
w.bufferPacket(p, 0x23456l);
197+
p = new OggPacket(getBytes(21));
198+
w.bufferPacket(p, 0x34567l);
199+
p = new OggPacket(getBytes(144077));
200+
w.bufferPacket(p, 0x45678l);
201+
w.close();
202+
203+
// Check
204+
ogg = new OggFile(new ByteArrayInputStream(baos.toByteArray()));
205+
OggPacketReader r = ogg.getPacketReader();
206+
207+
// Empty packet/page at 0
208+
p = r.getNextPacket();
209+
assertEquals(0, p.getSequenceNumber());
210+
assertEquals(0, p.getGranulePosition());
211+
assertEquals(6, p.getData().length);
212+
213+
// 2-and-a-bit packet all at last value
214+
p = r.getNextPacket();
215+
assertEquals(3, p.getSequenceNumber());
216+
assertEquals(0x12345l, p.getGranulePosition());
217+
assertEquals(131072, p.getData().length);
218+
219+
// Next two both take value set on the
220+
// last whole one in the page
221+
p = r.getNextPacket();
222+
assertEquals(4, p.getSequenceNumber());
223+
assertEquals(0x34567l, p.getGranulePosition());
224+
assertEquals(15, p.getData().length);
225+
226+
p = r.getNextPacket();
227+
assertEquals(4, p.getSequenceNumber());
228+
assertEquals(0x34567l, p.getGranulePosition());
229+
assertEquals(21, p.getData().length);
230+
231+
// While the one that spans that page and the
232+
// next two gets its own value
233+
p = r.getNextPacket();
234+
assertEquals(6, p.getSequenceNumber());
235+
assertEquals(0x45678l, p.getGranulePosition());
236+
assertEquals(144077, p.getData().length);
237+
}
167238
}

0 commit comments

Comments
 (0)