Signed-off-by: Paul B Mahol <one...@gmail.com> --- libavformat/thp.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-)
diff --git a/libavformat/thp.c b/libavformat/thp.c index 5569027..c661569 100644 --- a/libavformat/thp.c +++ b/libavformat/thp.c @@ -114,6 +114,7 @@ static int thp_read_header(AVFormatContext *s) st->codec->codec_tag = 0; /* no fourcc */ st->codec->width = avio_rb32(pb); st->codec->height = avio_rb32(pb); + st->start_time = 0; st->nb_frames = st->duration = thp->framecnt; thp->vst = st; @@ -135,6 +136,7 @@ static int thp_read_header(AVFormatContext *s) st->codec->codec_tag = 0; /* no fourcc */ st->codec->channels = avio_rb32(pb); /* numChannels. */ st->codec->sample_rate = avio_rb32(pb); /* Frequency. */ + st->start_time = 0; st->duration = avio_rb32(pb); avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); @@ -153,6 +155,7 @@ static int thp_read_packet(AVFormatContext *s, ThpDemuxContext *thp = s->priv_data; AVIOContext *pb = s->pb; unsigned int size; + AVStream *st; int ret; if (thp->audiosize == 0) { @@ -161,6 +164,8 @@ static int thp_read_packet(AVFormatContext *s, return AVERROR_EOF; avio_seek(pb, thp->next_frame, SEEK_SET); + st = s->streams[thp->video_stream_index]; + av_add_index_entry(st, thp->next_frame, thp->frame, thp->next_framesz, 0, AVINDEX_KEYFRAME); /* Locate the next frame and read out its size. */ thp->next_frame += FFMAX(thp->next_framesz, 1); @@ -185,7 +190,10 @@ static int thp_read_packet(AVFormatContext *s, } pkt->stream_index = thp->video_stream_index; + pkt->pts = thp->frame - !thp->has_audio; } else { + int64_t pos = avio_tell(pb); + ret = av_get_packet(pb, pkt, thp->audiosize); if (ret < 0) return ret; @@ -195,8 +203,7 @@ static int thp_read_packet(AVFormatContext *s, } pkt->stream_index = thp->audio_stream_index; - if (thp->audiosize >= 8) - pkt->duration = AV_RB32(&pkt->data[4]); + pkt->pos = pos; thp->audiosize = 0; thp->frame++; @@ -205,11 +212,42 @@ static int thp_read_packet(AVFormatContext *s, return 0; } +static int thp_read_seek(AVFormatContext *s, int stream_index, + int64_t timestamp, int flags) +{ + ThpDemuxContext *thp = s->priv_data; + AVStream *st = s->streams[stream_index]; + int index = av_index_search_timestamp(st, timestamp, flags); + + if (stream_index != thp->video_stream_index) + return -1; + + if (index >= 0 && index < st->nb_index_entries) { + AVIndexEntry *e = &st->index_entries[index]; + + thp->next_frame = e->pos; + thp->next_framesz = e->size; + thp->frame = index; + thp->audiosize = 0; + return 0; + } else if (st->nb_index_entries && st->index_entries[st->nb_index_entries - 1].timestamp <= timestamp) { + AVIndexEntry *e = &st->index_entries[st->nb_index_entries - 1]; + + thp->next_frame = e->pos; + thp->next_framesz = e->size; + thp->frame = st->nb_index_entries - 1; + thp->audiosize = 0; + } + + return -1; +} + AVInputFormat ff_thp_demuxer = { .name = "thp", .long_name = NULL_IF_CONFIG_SMALL("THP"), .priv_data_size = sizeof(ThpDemuxContext), .read_probe = thp_probe, .read_header = thp_read_header, - .read_packet = thp_read_packet + .read_packet = thp_read_packet, + .read_seek = thp_read_seek, }; -- 1.9.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel