@@ -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