[Vorbis-dev] copying an ogg stream

illiminable ogg at illiminable.com
Wed Sep 22 09:07:09 PDT 2004


Why is it that you break the packets out of the page ?

Why not just keep the pages intact and change their serial no (i assume the 
granule pos change you is to add a constant delta of some kind) ?

Zen.

----- Original Message ----- 
From: "Christoph Rupp" <crupp at umc-web.de>
To: <vorbis-dev at xiph.org>
Sent: Wednesday, September 22, 2004 11:41 PM
Subject: [Vorbis-dev] copying an ogg stream


> dear list,
>
> i am trying to write a small program which reads an ogg file and writes it 
> to another ogg file (and changes serial number, granulepos etc on the 
> fly).
>
> reading the ogg file is ok (ogg_sync_pageout, ogg_stream_pagein, 
> ogg_stream_packetout). but writing the file doesn't work - the granulepos 
> and page structures don't match with the original file.
>
> here's what i am doing. (python-like pseudo-code). First i create copies 
> of all packets in a page, store them in 'list'; i also save the 
> granule-position of this page:
>
> foreach page in oggfile:
>   g=get_granulepos(page)
>   list=[]
>   foreach packet in page:
>     list.append(dup_packet(packet))  # creates a deep copy of packet
>
> then i write all pages but the last one to the output file (because, as i 
> understand it, only the last packet has the correct granulepos; all other 
> packets have a granulepos of -1).
>
>   foreach packet in list[:-1]:   # does NOT include the last packet!
>     packet.granulepos=-1
>     packet.packetno=global_packetno++
>     write_packet(packet)
>
> now i write the last packet (this is also the place where i would set 
> e_o_f...):
>
>   packet=list[len(list)-1]
>   packet.granulepos=g
>   packet.packetno=global_packetno++
>   write_packet(packet)
>
>
> the write_packet function looks like this:
>
> def write_packet(packet):
>   ogg_stream_packetin(os, packet)
>
>   ogg_page page;
>
>   while (ogg_stream_pageout(os, page)):
>     fwrite(page.header, page.header_len, f)
>     fwrite(page.body, page.body_len, f)
>
> (if the e_o_s flag is set, then i use ogg_stream_flush() instead of 
> ogg_stream_pageout())
>
> my problem is: when i look at the original file, it differs from the 
> copied file. this is the output of the first few lines with oggzdump:
>
> original file:
>
> 0000003a: serialno 1295053610, granulepos 0, packetno 0 *** bos:
> 00000fc7: serialno 1295053610, granulepos -1, packetno 1:
> 00000fc7: serialno 1295053610, granulepos 0, packetno 2:
> 00002030: serialno 1295053610, granulepos -1, packetno 3:
> 00002030: serialno 1295053610, granulepos -1, packetno 4:
> 00002030: serialno 1295053610, granulepos -1, packetno 5:
> ...
> 00002030: serialno 1295053610, granulepos 23296, packetno 38:
>
> the new file:
>
> 0000003a: serialno 0000012345, granulepos 0, packetno 0 *** bos:
> 00001142: serialno 0000012345, granulepos -1, packetno 1:
> 00001142: serialno 0000012345, granulepos -1, packetno 2:
> 00001142: serialno 0000012345, granulepos -1, packetno 3:
> 00001142: serialno 0000012345, granulepos -1, packetno 4:
> 00002231: serialno 0000012345, granulepos -1, packetno 5:
> ...
> 00007527: serialno 0000012345, granulepos 175744, packetno 168:
>
>
> first of all the granule positions have changed, and also in the original 
> file packet no 38 is the last packet of the first page. in the new file, 
> it's packet 168! but when stepping through the debugger, i'm pretty sure i 
> have submitted the correct packets...
>
> also, ogginfo complains a lot about "Negative granulepos on vorbis stream 
> outside of headers. This file was created by a buggy encoder". Playback 
> with ogg123 is ok, though.
>
> i hope i have made my case clear and the pseudo code is not too 
> overwhelming :) i can also send the "real" C/C++ code, if somebody wants 
> to see it.
>
> thanks for every idea!
> Chris
> _______________________________________________
> Vorbis-dev mailing list
> Vorbis-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/vorbis-dev
>
> 




More information about the Vorbis-dev mailing list