Browse Source

oggtheora: Fix initial pts

code based on the solution in vorbis

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n0.11
Michael Niedermayer 13 years ago
parent
commit
231d32c8d7
1 changed files with 42 additions and 0 deletions
  1. +42
    -0
      libavformat/oggparsetheora.c

+ 42
- 0
libavformat/oggparsetheora.c View File

@@ -151,9 +151,51 @@ theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp, int64_t *dts)
return iframe + pframe; return iframe + pframe;
} }


static int theora_packet(AVFormatContext *s, int idx)
{
struct ogg *ogg = s->priv_data;
struct ogg_stream *os = ogg->streams + idx;
int duration;

/* first packet handling
here we parse the duration of each packet in the first page and compare
the total duration to the page granule to find the encoder delay and
set the first timestamp */

if (!os->lastpts) {
int seg;
uint8_t *last_pkt = os->buf + os->pstart;
uint8_t *next_pkt = last_pkt;
int first_duration = 0;

duration = 0;
for (seg = 0; seg < os->nsegs; seg++) {
if (os->segments[seg] < 255) {
if (!duration)
first_duration = 1;
duration++;
last_pkt = next_pkt + os->segments[seg];
}
next_pkt += os->segments[seg];
}
os->lastpts = os->lastdts = theora_gptopts(s, idx, os->granule, NULL) - duration;
s->streams[idx]->start_time = os->lastpts + first_duration;
if (s->streams[idx]->duration)
s->streams[idx]->duration -= s->streams[idx]->start_time;
}

/* parse packet duration */
if (os->psize > 0) {
os->pduration = 1;
}

return 0;
}

const struct ogg_codec ff_theora_codec = { const struct ogg_codec ff_theora_codec = {
.magic = "\200theora", .magic = "\200theora",
.magicsize = 7, .magicsize = 7,
.header = theora_header, .header = theora_header,
.packet = theora_packet,
.gptopts = theora_gptopts .gptopts = theora_gptopts
}; };

Loading…
Cancel
Save