Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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;
}