Fixes Ticket1333
Unified · Split
| @@ -12,6 +12,7 @@ version <next>: · 11 unmodified lines | ||
| 12 | 12 | - cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold |
| 13 | 13 | - Camellia symmetric block cipher |
| 14 | 14 | - OpenH264 encoder wrapper |
| 15 | +- VOC seeking support | |
| 15 | 16 | |
| 16 | 17 | |
| 17 | 18 | version 2.5: |
| @@ -31,7 +31,7 @@ · 30 unmodified lines | ||
| 31 | 31 | |
| 32 | 32 | #define LIBAVFORMAT_VERSION_MAJOR 56 |
| 33 | 33 | #define LIBAVFORMAT_VERSION_MINOR 18 |
| 34 | −#define LIBAVFORMAT_VERSION_MICRO 100 | |
| 34 | +#define LIBAVFORMAT_VERSION_MICRO 101 | |
| 35 | 35 | |
| 36 | 36 | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ |
| 37 | 37 | LIBAVFORMAT_VERSION_MINOR, \ |
| @@ -27,6 +27,7 @@ · 26 unmodified lines | ||
| 27 | 27 | |
| 28 | 28 | typedef struct voc_dec_context { |
| 29 | 29 | int64_t remaining_size; |
| 30 | + int64_t pts; | |
| 30 | 31 | } VocDecContext; |
| 31 | 32 | |
| 32 | 33 | typedef enum voc_type { |
| @@ -71,6 +71,15 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) · 70 unmodified lines | ||
| 71 | 71 | int size, tmp_codec=-1; |
| 72 | 72 | int sample_rate = 0; |
| 73 | 73 | int channels = 1; |
| 74 | + int64_t duration; | |
| 75 | + int ret; | |
| 76 | + | |
| 77 | + av_add_index_entry(st, | |
| 78 | + avio_tell(pb), | |
| 79 | + voc->pts, | |
| 80 | + voc->remaining_size, | |
| 81 | + 0, | |
| 82 | + AVINDEX_KEYFRAME); | |
| 74 | 83 | |
| 75 | 84 | while (!voc->remaining_size) { |
| 76 | 85 | type = avio_r8(pb); |
| @@ -156,7 +165,17 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) · 79 unmodified lines | ||
| 156 | 165 | max_size = 2048; |
| 157 | 166 | size = FFMIN(voc->remaining_size, max_size); |
| 158 | 167 | voc->remaining_size -= size; |
| 159 | − return av_get_packet(pb, pkt, size); | |
| 168 | + | |
| 169 | + ret = av_get_packet(pb, pkt, size); | |
| 170 | + pkt->dts = pkt->pts = voc->pts; | |
| 171 | + | |
| 172 | + duration = av_get_audio_frame_duration(st->codec, size); | |
| 173 | + if (duration > 0 && voc->pts != AV_NOPTS_VALUE) | |
| 174 | + voc->pts += duration; | |
| 175 | + else | |
| 176 | + voc->pts = AV_NOPTS_VALUE; | |
| 177 | + | |
| 178 | + return ret; | |
| 160 | 179 | } |
| 161 | 180 | |
| 162 | 181 | static int voc_read_packet(AVFormatContext *s, AVPacket *pkt) |
| @@ -164,6 +183,28 @@ static int voc_read_packet(AVFormatContext *s, AVPacket *pkt) · 1 unmodified line | ||
| 164 | 183 | return ff_voc_get_packet(s, pkt, s->streams[0], 0); |
| 165 | 184 | } |
| 166 | 185 | |
| 186 | +static int voc_read_seek(AVFormatContext *s, int stream_index, | |
| 187 | + int64_t timestamp, int flags) | |
| 188 | +{ | |
| 189 | + VocDecContext *voc = s->priv_data; | |
| 190 | + AVStream *st = s->streams[stream_index]; | |
| 191 | + int index = av_index_search_timestamp(st, timestamp, flags); | |
| 192 | + | |
| 193 | + if (index >= 0 && index < st->nb_index_entries - 1) { | |
| 194 | + AVIndexEntry *e = &st->index_entries[index]; | |
| 195 | + avio_seek(s->pb, e->pos, SEEK_SET); | |
| 196 | + voc->pts = e->timestamp; | |
| 197 | + voc->remaining_size = e->size; | |
| 198 | + return 0; | |
| 199 | + } else if (st->nb_index_entries && st->index_entries[0].timestamp <= timestamp) { | |
| 200 | + AVIndexEntry *e = &st->index_entries[st->nb_index_entries - 1]; | |
| 201 | + // prepare context for seek_frame_generic() | |
| 202 | + voc->pts = e->timestamp; | |
| 203 | + voc->remaining_size = e->size; | |
| 204 | + } | |
| 205 | + return -1; | |
| 206 | +} | |
| 207 | + | |
| 167 | 208 | AVInputFormat ff_voc_demuxer = { |
| 168 | 209 | .name = "voc", |
| 169 | 210 | .long_name = NULL_IF_CONFIG_SMALL("Creative Voice"), |
| @@ -171,5 +212,6 @@ AVInputFormat ff_voc_demuxer = { · 1 unmodified line | ||
| 171 | 212 | .read_probe = voc_probe, |
| 172 | 213 | .read_header = voc_read_header, |
| 173 | 214 | .read_packet = voc_read_packet, |
| 215 | + .read_seek = voc_read_seek, | |
| 174 | 216 | .codec_tag = (const AVCodecTag* const []){ ff_voc_codec_tags, 0 }, |
| 175 | 217 | }; |
| @@ -1,27 +1,44 @@ | ||
| 1 | 1 | ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 |
| 2 | −ret:-1 st:-1 flags:0 ts:-1.000000 | |
| 3 | −ret:-1 st:-1 flags:1 ts: 1.894167 | |
| 4 | −ret:-1 st: 0 flags:0 ts: 0.788330 | |
| 2 | +ret: 0 st:-1 flags:0 ts:-1.000000 | |
| 3 | +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 | |
| 4 | +ret: 0 st:-1 flags:1 ts: 1.894167 | |
| 5 | +ret:-EOF | |
| 6 | +ret: 0 st: 0 flags:0 ts: 0.788330 | |
| 7 | +ret: 0 st: 0 flags:1 dts: 0.800773 pts: 0.800773 pos: 33956 size: 1024 | |
| 5 | 8 | ret:-1 st: 0 flags:1 ts:-0.317494 |
| 6 | 9 | ret:-1 st:-1 flags:0 ts: 2.576668 |
| 7 | −ret:-1 st:-1 flags:1 ts: 1.470835 | |
| 8 | −ret:-1 st: 0 flags:0 ts: 0.365012 | |
| 10 | +ret: 0 st:-1 flags:1 ts: 1.470835 | |
| 11 | +ret:-EOF | |
| 12 | +ret: 0 st: 0 flags:0 ts: 0.365012 | |
| 13 | +ret: 0 st: 0 flags:1 dts: 0.376834 pts: 0.376834 pos: 15452 size: 1024 | |
| 9 | 14 | ret:-1 st: 0 flags:1 ts:-0.740834 |
| 10 | 15 | ret:-1 st:-1 flags:0 ts: 2.153336 |
| 11 | −ret:-1 st:-1 flags:1 ts: 1.047503 | |
| 12 | −ret:-1 st: 0 flags:0 ts:-0.058328 | |
| 13 | −ret:-1 st: 0 flags:1 ts: 2.835848 | |
| 16 | +ret: 0 st:-1 flags:1 ts: 1.047503 | |
| 17 | +ret:-EOF | |
| 18 | +ret: 0 st: 0 flags:0 ts:-0.058328 | |
| 19 | +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 | |
| 20 | +ret: 0 st: 0 flags:1 ts: 2.835848 | |
| 21 | +ret:-EOF | |
| 14 | 22 | ret:-1 st:-1 flags:0 ts: 1.730004 |
| 15 | −ret:-1 st:-1 flags:1 ts: 0.624171 | |
| 16 | −ret:-1 st: 0 flags:0 ts:-0.481669 | |
| 17 | −ret:-1 st: 0 flags:1 ts: 2.412507 | |
| 23 | +ret: 0 st:-1 flags:1 ts: 0.624171 | |
| 24 | +ret: 0 st: 0 flags:1 dts: 0.612356 pts: 0.612356 pos: 25732 size: 1024 | |
| 25 | +ret: 0 st: 0 flags:0 ts:-0.481669 | |
| 26 | +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 | |
| 27 | +ret: 0 st: 0 flags:1 ts: 2.412507 | |
| 28 | +ret:-EOF | |
| 18 | 29 | ret:-1 st:-1 flags:0 ts: 1.306672 |
| 19 | −ret:-1 st:-1 flags:1 ts: 0.200839 | |
| 20 | −ret:-1 st: 0 flags:0 ts:-0.904986 | |
| 21 | −ret:-1 st: 0 flags:1 ts: 1.989167 | |
| 22 | −ret:-1 st:-1 flags:0 ts: 0.883340 | |
| 30 | +ret: 0 st:-1 flags:1 ts: 0.200839 | |
| 31 | +ret: 0 st: 0 flags:1 dts: 0.188417 pts: 0.188417 pos: 7228 size: 1024 | |
| 32 | +ret: 0 st: 0 flags:0 ts:-0.904986 | |
| 33 | +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 | |
| 34 | +ret: 0 st: 0 flags:1 ts: 1.989167 | |
| 35 | +ret:-EOF | |
| 36 | +ret: 0 st:-1 flags:0 ts: 0.883340 | |
| 37 | +ret: 0 st: 0 flags:1 dts: 0.894981 pts: 0.894981 pos: 38068 size: 1024 | |
| 23 | 38 | ret:-1 st:-1 flags:1 ts:-0.222493 |
| 24 | 39 | ret:-1 st: 0 flags:0 ts: 2.671673 |
| 25 | −ret:-1 st: 0 flags:1 ts: 1.565849 | |
| 26 | −ret:-1 st:-1 flags:0 ts: 0.460008 | |
| 40 | +ret: 0 st: 0 flags:1 ts: 1.565849 | |
| 41 | +ret:-EOF | |
| 42 | +ret: 0 st:-1 flags:0 ts: 0.460008 | |
| 43 | +ret: 0 st: 0 flags:1 dts: 0.471043 pts: 0.471043 pos: 19564 size: 1024 | |
| 27 | 44 | ret:-1 st:-1 flags:1 ts:-0.645825 |