David Flynn
2008-Nov-04 09:46 UTC
[ogg-dev] [PATCH] liboggz: Update Dirac granulepos definition
The definition of granule position for an OggDirac elementary stream isn't the same as theora. Index: tools/oggz_tools.c ==================================================================--- tools/oggz_tools.c (revision 3759) +++ tools/oggz_tools.c (working copy) @@ -454,7 +454,15 @@ iframe = granulepos >> granuleshift; pframe = granulepos - (iframe << granuleshift); - ret = fprintf (stream, "%" PRId64 "|%" PRId64, iframe, pframe); + if (oggz_stream_get_content (oggz, serialno) != OGGZ_CONTENT_DIRAC) { + ret = fprintf (stream, "%" PRId64 "|%" PRId64, iframe, pframe); + } else { + uint32_t pt = (iframe + pframe) >> 9; + uint16_t dist = ((iframe & 0xff) << 8) | (pframe & 0xff); + uint16_t delay = pframe >> 9; + int64_t dt = pt - delay; + ret = fprintf (stream, "(pt:%u,dt:%"PRId64",dist:%hu,delay:%hu)", pt, dt, dist, delay); + } } return ret; Index: liboggz/oggz_auto.c ==================================================================--- liboggz/oggz_auto.c (revision 3759) +++ liboggz/oggz_auto.c (working copy) @@ -358,31 +358,26 @@ static int auto_dirac (OGGZ * oggz, long serialno, unsigned char * data, long length, void * user_data) { - char keyframe_granule_shift = 32; - int keyframe_shift; + int granule_shift = 22; /* not a typo */ dirac_info *info; info = malloc(sizeof(dirac_info)); dirac_parse_info(info, data, length); - /* - FIXME: where is this in Ogg Dirac? - keyframe_granule_shift = (char) ((header[40] & 0x03) << 3); - keyframe_granule_shift |= (header[41] & 0xe0) >> 5; - */ - keyframe_shift = keyframe_granule_shift; - #ifdef DEBUG - printf ("Got dirac fps %d/%d, keyframe_shift %d\n", - fps_numerator, fps_denominator, keyframe_shift); + printf ("Got dirac fps %d/%d, granule_shift %d\n", + info->fps_numerator, info->fps_denominator, granule_shift); #endif - oggz_set_granulerate (oggz, serialno, (ogg_int64_t)info->fps_numerator, + /* the granulerate is twice the frame rate (in order to handle interlace) + * it is also multiplied by (1<<9) since the decode time is stored in + * the top 32bits of granulepos, but the granule_shift is 22. */ + oggz_set_granulerate (oggz, serialno, 2*(1<<9)*(ogg_int64_t)info->fps_numerator, OGGZ_AUTO_MULT * (ogg_int64_t)info->fps_denominator); - oggz_set_granuleshift (oggz, serialno, keyframe_shift); + oggz_set_granuleshift (oggz, serialno, granule_shift); - oggz_stream_set_numheaders (oggz, serialno, 3); + oggz_stream_set_numheaders (oggz, serialno, 0); free(info); return 1;
Ralph Giles
2008-Nov-04 20:28 UTC
[ogg-dev] [PATCH] liboggz: Update Dirac granulepos definition
On Tue, Nov 4, 2008 at 1:46 AM, David Flynn <davidf+nntp at woaf.net> wrote:> The definition of granule position for an OggDirac elementary stream > isn't the same as theora.Committed, thanks. -r