BOOL ovd_parse_stream(ovd_stream_buf* buf) { ovd_handle* handle = (ovd_handle*)buf->handle; ogg_sync_wrote(handle->oy, buf->len); if (ogg_sync_pageout(handle->oy, &handle->og) != 1) goto fail; // ogg_stream_init(&handle->os, ogg_page_serialno(&handle->og)); handle->os = ogg_stream_create(ogg_page_serialno(&handle->og)); vorbis_info_init(&handle->vi); vorbis_comment_init(&handle->vc); if (ogg_stream_pagein(handle->os, &handle->og) < 0) goto fail; if (ogg_stream_packetout(handle->os,&handle->op) != 1) goto fail; if (vorbis_synthesis_headerin(&handle->vi, &handle->vc, &handle->op) < 0) goto fail; handle->init = 0; handle->eof = 0; ovd_header_init(handle); buf->buf = ogg_sync_bufferin(handle->oy, OVD_STREAM_BUF_LEN); buf->len = OVD_STREAM_BUF_LEN; return TRUE; fail: // ogg_sync_init(&handle->oy); handle->oy = ogg_sync_create(); buf->buf = ogg_sync_bufferin(handle->oy, OVD_STREAM_BUF_LEN); buf->len = OVD_STREAM_BUF_LEN; return FALSE; }
static int Init(ogg* p) { format_reader* Reader = p->Format.Reader; format_buffer* Buffer; int i; memset(&p->OggPage,0,sizeof(ogg_page)); p->OggSync = ogg_sync_create(); p->Format.TimeStamps = 1; if (!p->OggSync) return ERR_OUT_OF_MEMORY; Format_ReadBuffer(Reader,0); Buffer = Format_BufferRemove(Reader); if (!Buffer) return ERR_INVALID_DATA; // search for 'OggS' pattern for (i=3;i<Buffer->Length;++i) if (Buffer->Block.Ptr[i-3]=='O' && Buffer->Block.Ptr[i-2]=='g' && Buffer->Block.Ptr[i-1]=='g' && Buffer->Block.Ptr[i-0]=='S') break; if (i==Buffer->Length) { Format_BufferRelease(&p->Format,Buffer); return ERR_INVALID_DATA; } return AddBuffer(p,Buffer); }
ovd_stream_buf* ovd_init_stream() { ovd_handle* handle = new ovd_handle; memset(handle, 0, sizeof(ovd_handle)); // ogg_sync_init(&handle->oy); handle->oy = ogg_sync_create(); ovd_stream_buf* ret = new ovd_stream_buf; ret->handle = (HANDLE)handle; ret->buf = ogg_sync_bufferin(handle->oy, OVD_STREAM_BUF_LEN); ret->len = OVD_STREAM_BUF_LEN; return ret; }
static int ReadPacketTime( ogg* p, format_reader* Reader, format_packet* Packet ) { // only called by CalcDuration format_buffer* Buffer; int Bytes; ogg_buffer* Ptr; ogg_sync_state* Sync = ogg_sync_create(); ogg_page Page; if (!Sync) return ERR_OUT_OF_MEMORY; while ((Buffer = Format_BufferRemove(Reader))!=NULL) { Ptr = ogg_sync_bufferinext(Sync); if (Ptr) { Ptr->ext = &p->Format; Ptr->extdata = Buffer; Ptr->data = Buffer->Block.Ptr; Ptr->size = Buffer->Length; ogg_sync_wrote(Sync,Buffer->Length); } else Format_BufferRelease(&p->Format,Buffer); } memset(&Page,0,sizeof(Page)); while ((Bytes = ogg_sync_pageseek(Sync,&Page)) != 0) { if (Bytes > 0) { int64_t MediaTime = ogg_page_granulepos(&Page); int Id = ogg_page_serialno(&Page); int i; if (MediaTime != -1) for (i=0;i<p->Format.StreamCount;++i) if (p->Format.Streams[i]->Id == Id) { oggstream* s = (oggstream*) p->Format.Streams[i]; if (s->MediaRateNum) { tick_t RefTime = (tick_t)((MediaTime * s->MediaRateDen) / s->MediaRateNum); if (RefTime > Packet->RefTime) { Packet->Stream = &s->Stream; Packet->RefTime = RefTime; } } break; } } } ogg_page_release(&Page); ogg_sync_destroy(Sync); return ERR_NONE; }