[FFmpeg-cvslog] avformat/movenc: split MPEG-4 bit rate value calculation

2020-09-22 Thread Jan Ekström
ffmpeg | branch: master | Jan Ekström  | Sun Sep 20 14:41:18 
2020 +0300| [667d5045d38c19a9a7ccfe7f1abaaf4cb8b225fc] | committer: Jan Ekström

avformat/movenc: split MPEG-4 bit rate value calculation

This can now be re-utilized in other places.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=667d5045d38c19a9a7ccfe7f1abaaf4cb8b225fc
---

 libavformat/movenc.c | 44 ++--
 1 file changed, 34 insertions(+), 10 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 12471c7d68..5888d10770 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -633,12 +633,41 @@ static unsigned compute_avg_bitrate(MOVTrack *track)
 return size * 8 * track->timescale / track->track_duration;
 }
 
+struct mpeg4_bit_rate_values {
+uint32_t buffer_size;  ///< Size of the decoding buffer for the elementary 
stream in bytes.
+uint32_t max_bit_rate; ///< Maximum rate in bits/second over any window of 
one second.
+uint32_t avg_bit_rate; ///< Average rate in bits/second over the entire 
presentation.
+};
+
+static struct mpeg4_bit_rate_values calculate_mpeg4_bit_rates(MOVTrack *track)
+{
+AVCPBProperties *props =
+(AVCPBProperties*)av_stream_get_side_data(track->st,
+  AV_PKT_DATA_CPB_PROPERTIES,
+  NULL);
+struct mpeg4_bit_rate_values bit_rates = { 0 };
+
+bit_rates.avg_bit_rate = compute_avg_bitrate(track);
+
+// (FIXME should be max rate in any 1 sec window)
+bit_rates.max_bit_rate = FFMAX(track->par->bit_rate,
+   bit_rates.avg_bit_rate);
+
+// utilize values from properties if we have them available
+if (props) {
+bit_rates.max_bit_rate = FFMAX(bit_rates.max_bit_rate,
+   props->max_bitrate);
+bit_rates.buffer_size = props->buffer_size / 8;
+}
+
+return bit_rates;
+}
+
 static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
 {
-AVCPBProperties *props;
+struct mpeg4_bit_rate_values bit_rates = calculate_mpeg4_bit_rates(track);
 int64_t pos = avio_tell(pb);
 int decoder_specific_info_len = track->vos_len ? 5 + track->vos_len : 0;
-unsigned avg_bitrate;
 
 avio_wb32(pb, 0); // size
 ffio_wfourcc(pb, "esds");
@@ -669,14 +698,9 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack 
*track) // Basic
 else
 avio_w8(pb, 0x11); // flags (= Visualstream)
 
-props = (AVCPBProperties*)av_stream_get_side_data(track->st, 
AV_PKT_DATA_CPB_PROPERTIES,
-  NULL);
-
-avio_wb24(pb, props ? props->buffer_size / 8 : 0); // Buffersize DB
-
-avg_bitrate = compute_avg_bitrate(track);
-avio_wb32(pb, props ? FFMAX3(props->max_bitrate, props->avg_bitrate, 
avg_bitrate) : FFMAX(track->par->bit_rate, avg_bitrate)); // maxbitrate (FIXME 
should be max rate in any 1 sec window)
-avio_wb32(pb, avg_bitrate);
+avio_wb24(pb, bit_rates.buffer_size); // Buffersize DB
+avio_wb32(pb, bit_rates.max_bit_rate); // maxbitrate
+avio_wb32(pb, bit_rates.avg_bit_rate);
 
 if (track->vos_len) {
 // DecoderSpecific info descriptor

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-cvslog] avformat/movenc: implement writing of the btrt box

2020-09-22 Thread Jan Ekström
ffmpeg | branch: master | Jan Ekström  | Sun Sep 20 15:26:42 
2020 +0300| [3838e8fc210aa09a9f9058506c0ce80b6ad9b9c3] | committer: Jan Ekström

avformat/movenc: implement writing of the btrt box

This is utilized by various media ingests to figure out the bit
rate of the content you are pushing towards it, so write it for
video, audio and subtitle tracks in case at least one nonzero value
is available. It is only mentioned for timed metadata sample
descriptions in QTFF, so limit it only to ISOBMFF (MODE_MP4) mode.

Updates the FATE tests which have their results changed due to the
20 extra bytes being written per track.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3838e8fc210aa09a9f9058506c0ce80b6ad9b9c3
---

 libavformat/movenc.c   | 33 +
 tests/fate/mov.mak |  2 +-
 tests/ref/fate/copy-trac3074   |  4 ++--
 tests/ref/fate/movenc  | 12 ++--
 tests/ref/lavf-fate/av1.mp4|  4 ++--
 tests/ref/lavf-fate/h264.mp4   |  4 ++--
 tests/ref/lavf/mp4 | 12 ++--
 tests/ref/vsynth/vsynth1-mpeg4 |  4 ++--
 tests/ref/vsynth/vsynth2-mpeg4 |  4 ++--
 tests/ref/vsynth/vsynth3-mpeg4 |  4 ++--
 tests/ref/vsynth/vsynth_lena-mpeg4 |  4 ++--
 11 files changed, 60 insertions(+), 27 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index a4ec4d05c9..76fb251fa8 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1073,6 +1073,25 @@ static int get_samples_per_packet(MOVTrack *track)
 return first_duration;
 }
 
+static int mov_write_btrt_tag(AVIOContext *pb, MOVTrack *track)
+{
+int64_t pos = avio_tell(pb);
+struct mpeg4_bit_rate_values bit_rates = calculate_mpeg4_bit_rates(track);
+if (!bit_rates.max_bit_rate && !bit_rates.avg_bit_rate &&
+!bit_rates.buffer_size)
+// no useful data to be written, skip
+return 0;
+
+avio_wb32(pb, 0); /* size */
+ffio_wfourcc(pb, "btrt");
+
+avio_wb32(pb, bit_rates.buffer_size);
+avio_wb32(pb, bit_rates.max_bit_rate);
+avio_wb32(pb, bit_rates.avg_bit_rate);
+
+return update_size(pb, pos);
+}
+
 static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, 
MOVMuxContext *mov, MOVTrack *track)
 {
 int64_t pos = avio_tell(pb);
@@ -1221,6 +1240,10 @@ static int mov_write_audio_tag(AVFormatContext *s, 
AVIOContext *pb, MOVMuxContex
 return ret;
 }
 
+if (track->mode == MODE_MP4 &&
+((ret = mov_write_btrt_tag(pb, track)) < 0))
+return ret;
+
 ret = update_size(pb, pos);
 return ret;
 }
@@ -1736,6 +1759,7 @@ static int mov_write_fiel_tag(AVIOContext *pb, MOVTrack 
*track, int field_order)
 
 static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track)
 {
+int ret = AVERROR_BUG;
 int64_t pos = avio_tell(pb);
 avio_wb32(pb, 0);/* size */
 avio_wl32(pb, track->tag); // store it byteswapped
@@ -1748,6 +1772,10 @@ static int mov_write_subtitle_tag(AVIOContext *pb, 
MOVTrack *track)
 else if (track->par->extradata_size)
 avio_write(pb, track->par->extradata, track->par->extradata_size);
 
+if (track->mode == MODE_MP4 &&
+((ret = mov_write_btrt_tag(pb, track)) < 0))
+return ret;
+
 return update_size(pb, pos);
 }
 
@@ -2051,6 +2079,7 @@ static void find_compressor(char * compressor_name, int 
len, MOVTrack *track)
 
 static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, 
MOVMuxContext *mov, MOVTrack *track)
 {
+int ret = AVERROR_BUG;
 int64_t pos = avio_tell(pb);
 char compressor_name[32] = { 0 };
 int avid = 0;
@@ -2231,6 +2260,10 @@ static int mov_write_video_tag(AVFormatContext *s, 
AVIOContext *pb, MOVMuxContex
 ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid);
 }
 
+if (track->mode == MODE_MP4 &&
+((ret = mov_write_btrt_tag(pb, track)) < 0))
+return ret;
+
 /* extra padding for avid stsd */
 /* 
https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP4939-CH204-61112
 */
 if (avid)
diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
index 8d3b6c7224..0fd20fef96 100644
--- a/tests/fate/mov.mak
+++ b/tests/fate/mov.mak
@@ -113,7 +113,7 @@ fate-mov-spherical-mono: CMD = run 
ffprobe$(PROGSSUF)$(EXESUF) -show_entries str
 
 fate-mov-gpmf-remux: CMD = md5 -i 
$(TARGET_SAMPLES)/mov/fake-gp-media-with-real-gpmf.mp4 -map 0 -c copy -fflags 
+bitexact -f mp4
 fate-mov-gpmf-remux: CMP = oneline
-fate-mov-gpmf-remux: REF = 8f48e435ee1f6b7e173ea756141eabf3
+fate-mov-gpmf-remux: REF = 6361cf3c2b9e6962c2eafbda138125f4
 
 fate-mov-guess-delay-1: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries 
stream=has_b_frames -select_streams v 
$(TARGET_SAMPLES)/h264/h264_3bf_nopyramid_nobsrestriction.mp4
 fate-mov-guess-delay-2: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries 
stream=has_b_frames -select_streams v 
$(TARGET_

[FFmpeg-cvslog] avformat/movenc: simplify ISML manifest bit rate logic

2020-09-22 Thread Jan Ekström
ffmpeg | branch: master | Jan Ekström  | Sun Sep 20 19:55:14 
2020 +0300| [519bd469d01af1727f943e5b73c964c94f29ccd0] | committer: Jan Ekström

avformat/movenc: simplify ISML manifest bit rate logic

The newly calculated average bit rate value is pretty much what is
being done here.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=519bd469d01af1727f943e5b73c964c94f29ccd0
---

 libavformat/movenc.c | 13 +++--
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 860e331b19..20768cd45f 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4209,7 +4209,6 @@ static int mov_write_isml_manifest(AVIOContext *pb, 
MOVMuxContext *mov, AVFormat
 {
 int64_t pos = avio_tell(pb);
 int i;
-int64_t manifest_bit_rate = 0;
 
 static const uint8_t uuid[] = {
 0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
@@ -4252,15 +4251,9 @@ static int mov_write_isml_manifest(AVIOContext *pb, 
MOVMuxContext *mov, AVFormat
 continue;
 }
 
-if (track->par->bit_rate) {
-manifest_bit_rate = track->par->bit_rate;
-} else {
-manifest_bit_rate = bit_rates.max_bit_rate;
-}
-
-avio_printf(pb, "<%s systemBitrate=\"%"PRId64"\">\n", type,
-manifest_bit_rate);
-param_write_int(pb, "systemBitrate", manifest_bit_rate);
+avio_printf(pb, "<%s systemBitrate=\"%"PRIu32"\">\n", type,
+bit_rates.avg_bit_rate);
+param_write_int(pb, "systemBitrate", bit_rates.avg_bit_rate);
 param_write_int(pb, "trackID", track_id);
 param_write_string(pb, "systemLanguage", lang ? lang->value : "und");
 

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-cvslog] avformat/movenc: use more fall-back values for average bit rate fields

2020-09-22 Thread Jan Ekström
ffmpeg | branch: master | Jan Ekström  | Sun Sep 20 18:14:48 
2020 +0300| [308882d9f2c6cc7159aba2ca7cdc99d07a9b531e] | committer: Jan Ekström

avformat/movenc: use more fall-back values for average bit rate fields

If the average bit rate cannot be calculated, such as in the case
of streamed fragmented mp4, utilize various available parameters
in priority order.

Tests are updated where the esds or btrt or ISML manifest boxes'
output changes.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=308882d9f2c6cc7159aba2ca7cdc99d07a9b531e
---

 libavformat/movenc.c | 17 +
 tests/ref/lavf/ismv  |  6 +++---
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 76fb251fa8..860e331b19 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -648,6 +648,23 @@ static struct mpeg4_bit_rate_values 
calculate_mpeg4_bit_rates(MOVTrack *track)
 struct mpeg4_bit_rate_values bit_rates = { 0 };
 
 bit_rates.avg_bit_rate = compute_avg_bitrate(track);
+if (!bit_rates.avg_bit_rate) {
+// if the average bit rate cannot be calculated at this point, such as
+// in the case of fragmented MP4, utilize the following values as
+// fall-back in priority order:
+//
+// 1. average bit rate property
+// 2. bit rate (usually average over the whole clip)
+// 3. maximum bit rate property
+
+if (props && props->avg_bitrate) {
+bit_rates.avg_bit_rate = props->avg_bitrate;
+} else if (track->par->bit_rate) {
+bit_rates.avg_bit_rate = track->par->bit_rate;
+} else if (props && props->max_bitrate) {
+bit_rates.avg_bit_rate = props->max_bitrate;
+}
+}
 
 // (FIXME should be max rate in any 1 sec window)
 bit_rates.max_bit_rate = FFMAX(track->par->bit_rate,
diff --git a/tests/ref/lavf/ismv b/tests/ref/lavf/ismv
index e7361705fa..ac7f72ba33 100644
--- a/tests/ref/lavf/ismv
+++ b/tests/ref/lavf/ismv
@@ -1,9 +1,9 @@
-4c6bc5ac805a76bbbd886a69d2e61554 *tests/data/lavf/lavf.ismv
+48fb8d7a5d19bd60f3a49ccf4b7d6593 *tests/data/lavf/lavf.ismv
 313169 tests/data/lavf/lavf.ismv
 tests/data/lavf/lavf.ismv CRC=0x9d9a638a
-18678627921460328ea3fed238d0d57d *tests/data/lavf/lavf.ismv
+d19cd8e310a2e94fe0a0d11c5dc29217 *tests/data/lavf/lavf.ismv
 322075 tests/data/lavf/lavf.ismv
 tests/data/lavf/lavf.ismv CRC=0xe8130120
-b9a858caf55b1eff2273e746e9f72dc4 *tests/data/lavf/lavf.ismv
+3b6023766845b51b075aed474c00f73c *tests/data/lavf/lavf.ismv
 312546 tests/data/lavf/lavf.ismv
 tests/data/lavf/lavf.ismv CRC=0x9d9a638a

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-cvslog] avformat/movenc: utilize bit rate helper function in ISML writing

2020-09-22 Thread Jan Ekström
ffmpeg | branch: master | Jan Ekström  | Sun Sep 20 15:01:29 
2020 +0300| [6475dc18cc4250b1d66e52a979eb71a3738d4716] | committer: Jan Ekström

avformat/movenc: utilize bit rate helper function in ISML writing

This way we have a single location in movenc which utilizes the
CPB properties.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6475dc18cc4250b1d66e52a979eb71a3738d4716
---

 libavformat/movenc.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 5888d10770..a4ec4d05c9 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4160,7 +4160,6 @@ static int mov_write_isml_manifest(AVIOContext *pb, 
MOVMuxContext *mov, AVFormat
 int64_t pos = avio_tell(pb);
 int i;
 int64_t manifest_bit_rate = 0;
-AVCPBProperties *props = NULL;
 
 static const uint8_t uuid[] = {
 0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
@@ -4186,6 +4185,8 @@ static int mov_write_isml_manifest(AVIOContext *pb, 
MOVMuxContext *mov, AVFormat
 
 for (i = 0; i < mov->nb_streams; i++) {
 MOVTrack *track = &mov->tracks[i];
+struct mpeg4_bit_rate_values bit_rates =
+calculate_mpeg4_bit_rates(track);
 const char *type;
 int track_id = track->track_id;
 char track_name_buf[32] = { 0 };
@@ -4201,12 +4202,10 @@ static int mov_write_isml_manifest(AVIOContext *pb, 
MOVMuxContext *mov, AVFormat
 continue;
 }
 
-props = (AVCPBProperties*)av_stream_get_side_data(track->st, 
AV_PKT_DATA_CPB_PROPERTIES, NULL);
-
 if (track->par->bit_rate) {
 manifest_bit_rate = track->par->bit_rate;
-} else if (props) {
-manifest_bit_rate = props->max_bitrate;
+} else {
+manifest_bit_rate = bit_rates.max_bit_rate;
 }
 
 avio_printf(pb, "<%s systemBitrate=\"%"PRId64"\">\n", type,

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-cvslog] avcodec/magicyuv: add support for recently added new format

2020-09-22 Thread Paul B Mahol
ffmpeg | branch: master | Paul B Mahol  | Tue Sep 22 18:31:14 
2020 +0200| [904ab5365cf4881eae1e5cac980f3c4f252b69cd] | committer: Paul B Mahol

avcodec/magicyuv: add support for recently added new format

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=904ab5365cf4881eae1e5cac980f3c4f252b69cd
---

 libavcodec/magicyuv.c | 8 
 libavformat/isom.c| 1 +
 libavformat/riff.c| 1 +
 3 files changed, 10 insertions(+)

diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c
index eed5ad1b40..b56d3e9d32 100644
--- a/libavcodec/magicyuv.c
+++ b/libavcodec/magicyuv.c
@@ -529,6 +529,14 @@ static int magy_decode_frame(AVCodecContext *avctx, void 
*data,
 avctx->pix_fmt = AV_PIX_FMT_GRAY10;
 s->bps = 10;
 break;
+case 0x7b:
+avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
+s->hshift[1] =
+s->vshift[1] =
+s->hshift[2] =
+s->vshift[2] = 1;
+s->bps = 10;
+break;
 default:
 avpriv_request_sample(avctx, "Format 0x%X", format);
 return AVERROR_PATCHWELCOME;
diff --git a/libavformat/isom.c b/libavformat/isom.c
index 209bbac5d1..019175d814 100644
--- a/libavformat/isom.c
+++ b/libavformat/isom.c
@@ -290,6 +290,7 @@ const AVCodecTag ff_codec_movvideo_tags[] = {
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', '0') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'A') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'G') },
+{ AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '0') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '2') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '4') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'R', 'G') },
diff --git a/libavformat/riff.c b/libavformat/riff.c
index 162e2b1bf2..388047fc4b 100644
--- a/libavformat/riff.c
+++ b/libavformat/riff.c
@@ -454,6 +454,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'A') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'G') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'G', '0') },
+{ AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '0') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '2') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '4') },
 { AV_CODEC_ID_MAGICYUV, MKTAG('M', '2', 'R', 'A') },

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-cvslog] avformat/argo_asf: implement seeking

2020-09-22 Thread Zane van Iperen
ffmpeg | branch: master | Zane van Iperen  | Mon Sep 21 
19:36:03 2020 +1000| [003b5c800fef909fa84dd2fae43d66bd434d3f7e] | committer: 
Zane van Iperen

avformat/argo_asf: implement seeking

Causes some error as the ADPCM predictors aren't known, but
the difference is negligible and not audible.

Signed-off-by: Zane van Iperen 

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=003b5c800fef909fa84dd2fae43d66bd434d3f7e
---

 libavformat/argo_asf.c | 25 -
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/libavformat/argo_asf.c b/libavformat/argo_asf.c
index 6f7d9e93c9..de941caeac 100644
--- a/libavformat/argo_asf.c
+++ b/libavformat/argo_asf.c
@@ -238,12 +238,34 @@ static int argo_asf_read_packet(AVFormatContext *s, 
AVPacket *pkt)
 
 pkt->stream_index   = st->index;
 pkt->duration   = asf->ckhdr.num_samples * (ret / 
st->codecpar->block_align);
+pkt->pts= asf->blocks_read * asf->ckhdr.num_samples;
 asf->blocks_read   += (ret / st->codecpar->block_align);
 
 pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
 return 0;
 }
 
+static int argo_asf_seek(AVFormatContext *s, int stream_index,
+ int64_t pts, int flags)
+{
+ArgoASFDemuxContext *asf = s->priv_data;
+AVStream *st = s->streams[stream_index];
+int64_t offset;
+uint32_t block = pts / asf->ckhdr.num_samples;
+
+if (block >= asf->ckhdr.num_blocks)
+return -1;
+
+offset = asf->fhdr.chunk_offset + ASF_CHUNK_HEADER_SIZE +
+ (block * st->codecpar->block_align);
+
+if ((offset = avio_seek(s->pb, offset, SEEK_SET)) < 0)
+return offset;
+
+asf->blocks_read = block;
+return 0;
+}
+
 /*
  * Not actually sure what ASF stands for.
  * - Argonaut Sound File?
@@ -255,7 +277,8 @@ AVInputFormat ff_argo_asf_demuxer = {
 .priv_data_size = sizeof(ArgoASFDemuxContext),
 .read_probe = argo_asf_probe,
 .read_header= argo_asf_read_header,
-.read_packet= argo_asf_read_packet
+.read_packet= argo_asf_read_packet,
+.read_seek  = argo_asf_seek,
 };
 #endif
 

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".