Fixes Ticket1333
Unified · Split
| @@ -12,6 +12,7 @@ version <next>: · 11 unmodified lines | |||
| 12 | - cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold | 12 | - cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold |
| 13 | - Camellia symmetric block cipher | 13 | - Camellia symmetric block cipher |
| 14 | - OpenH264 encoder wrapper | 14 | - OpenH264 encoder wrapper |
| 15 | - VOC seeking support | ||
| 15 | 16 | ||
| 16 | 17 | ||
| 17 | version 2.5: | 18 | version 2.5: |
| @@ -31,7 +31,7 @@ · 30 unmodified lines | |||
| 31 | 31 | ||
| 32 | #define LIBAVFORMAT_VERSION_MAJOR 56 | 32 | #define LIBAVFORMAT_VERSION_MAJOR 56 |
| 33 | #define LIBAVFORMAT_VERSION_MINOR 18 | 33 | #define LIBAVFORMAT_VERSION_MINOR 18 |
| 34 | #define LIBAVFORMAT_VERSION_MICRO 100 | 34 | #define LIBAVFORMAT_VERSION_MICRO 101 |
| 35 | 35 | ||
| 36 | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | 36 | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ |
| 37 | LIBAVFORMAT_VERSION_MINOR, \ | 37 | LIBAVFORMAT_VERSION_MINOR, \ |
| @@ -27,6 +27,7 @@ · 26 unmodified lines | |||
| 27 | 27 | ||
| 28 | typedef struct voc_dec_context { | 28 | typedef struct voc_dec_context { |
| 29 | int64_t remaining_size; | 29 | int64_t remaining_size; |
| 30 | int64_t pts; | ||
| 30 | } VocDecContext; | 31 | } VocDecContext; |
| 31 | 32 | ||
| 32 | typedef enum voc_type { | 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 | int size, tmp_codec=-1; | 71 | int size, tmp_codec=-1; |
| 72 | int sample_rate = 0; | 72 | int sample_rate = 0; |
| 73 | int channels = 1; | 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 | while (!voc->remaining_size) { | 84 | while (!voc->remaining_size) { |
| 76 | type = avio_r8(pb); | 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 | max_size = 2048; | 165 | max_size = 2048; |
| 157 | size = FFMIN(voc->remaining_size, max_size); | 166 | size = FFMIN(voc->remaining_size, max_size); |
| 158 | voc->remaining_size -= size; | 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 | static int voc_read_packet(AVFormatContext *s, AVPacket *pkt) | 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 | return ff_voc_get_packet(s, pkt, s->streams[0], 0); | 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 | AVInputFormat ff_voc_demuxer = { | 208 | AVInputFormat ff_voc_demuxer = { |
| 168 | .name = "voc", | 209 | .name = "voc", |
| 169 | .long_name = NULL_IF_CONFIG_SMALL("Creative Voice"), | 210 | .long_name = NULL_IF_CONFIG_SMALL("Creative Voice"), |
| @@ -171,5 +212,6 @@ AVInputFormat ff_voc_demuxer = { · 1 unmodified line | |||
| 171 | .read_probe = voc_probe, | 212 | .read_probe = voc_probe, |
| 172 | .read_header = voc_read_header, | 213 | .read_header = voc_read_header, |
| 173 | .read_packet = voc_read_packet, | 214 | .read_packet = voc_read_packet, |
| 215 | .read_seek = voc_read_seek, | ||
| 174 | .codec_tag = (const AVCodecTag* const []){ ff_voc_codec_tags, 0 }, | 216 | .codec_tag = (const AVCodecTag* const []){ ff_voc_codec_tags, 0 }, |
| 175 | }; | 217 | }; |
| @@ -1,27 +1,44 @@ | |||
| 1 | ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 | 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 | 2 | ret: 0 st:-1 flags:0 ts:-1.000000 |
| 3 | ret:-1 st:-1 flags:1 ts: 1.894167 | 3 | ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 32 size: 1024 |
| 4 | ret:-1 st: 0 flags:0 ts: 0.788330 | 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 | ret:-1 st: 0 flags:1 ts:-0.317494 | 8 | ret:-1 st: 0 flags:1 ts:-0.317494 |
| 6 | ret:-1 st:-1 flags:0 ts: 2.576668 | 9 | ret:-1 st:-1 flags:0 ts: 2.576668 |
| 7 | ret:-1 st:-1 flags:1 ts: 1.470835 | 10 | ret: 0 st:-1 flags:1 ts: 1.470835 |
| 8 | ret:-1 st: 0 flags:0 ts: 0.365012 | 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 | ret:-1 st: 0 flags:1 ts:-0.740834 | 14 | ret:-1 st: 0 flags:1 ts:-0.740834 |
| 10 | ret:-1 st:-1 flags:0 ts: 2.153336 | 15 | ret:-1 st:-1 flags:0 ts: 2.153336 |
| 11 | ret:-1 st:-1 flags:1 ts: 1.047503 | 16 | ret: 0 st:-1 flags:1 ts: 1.047503 |
| 12 | ret:-1 st: 0 flags:0 ts:-0.058328 | 17 | ret:-EOF |
| 13 | ret:-1 st: 0 flags:1 ts: 2.835848 | 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 | ret:-1 st:-1 flags:0 ts: 1.730004 | 22 | ret:-1 st:-1 flags:0 ts: 1.730004 |
| 15 | ret:-1 st:-1 flags:1 ts: 0.624171 | 23 | ret: 0 st:-1 flags:1 ts: 0.624171 |
| 16 | ret:-1 st: 0 flags:0 ts:-0.481669 | 24 | ret: 0 st: 0 flags:1 dts: 0.612356 pts: 0.612356 pos: 25732 size: 1024 |
| 17 | ret:-1 st: 0 flags:1 ts: 2.412507 | 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 | ret:-1 st:-1 flags:0 ts: 1.306672 | 29 | ret:-1 st:-1 flags:0 ts: 1.306672 |
| 19 | ret:-1 st:-1 flags:1 ts: 0.200839 | 30 | ret: 0 st:-1 flags:1 ts: 0.200839 |
| 20 | ret:-1 st: 0 flags:0 ts:-0.904986 | 31 | ret: 0 st: 0 flags:1 dts: 0.188417 pts: 0.188417 pos: 7228 size: 1024 |
| 21 | ret:-1 st: 0 flags:1 ts: 1.989167 | 32 | ret: 0 st: 0 flags:0 ts:-0.904986 |
| 22 | ret:-1 st:-1 flags:0 ts: 0.883340 | 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 | ret:-1 st:-1 flags:1 ts:-0.222493 | 38 | ret:-1 st:-1 flags:1 ts:-0.222493 |
| 24 | ret:-1 st: 0 flags:0 ts: 2.671673 | 39 | ret:-1 st: 0 flags:0 ts: 2.671673 |
| 25 | ret:-1 st: 0 flags:1 ts: 1.565849 | 40 | ret: 0 st: 0 flags:1 ts: 1.565849 |
| 26 | ret:-1 st:-1 flags:0 ts: 0.460008 | 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 | ret:-1 st:-1 flags:1 ts:-0.645825 | 44 | ret:-1 st:-1 flags:1 ts:-0.645825 |