[FFmpeg-cvslog] avformat/movenc: split MPEG-4 bit rate value calculation
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
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
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
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
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
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
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".