[FFmpeg-cvslog] avcodec/dv_profile: PAL DV files with dsf flag 0 - detect via pal flag and buf_size
Mark Plomer
git at videolan.org
Sat Apr 3 21:14:12 EEST 2021
ffmpeg | branch: release/4.4 | Mark Plomer <not-implemented at mark-plomer.de> | Thu Mar 18 13:19:16 2021 +0100| [76b5f726aa3b7827a00d2a65e9b4e55b29cabb5a] | committer: Marton Balint
avcodec/dv_profile: PAL DV files with dsf flag 0 - detect via pal flag and buf_size
Some old DV AVI files have the DSF-Flag of frames set to 0, although it
is PAL (maybe rendered with an old Ulead Media Studio Pro) ... this causes
ffmpeg/VLC-player to produce/play corrupted video (other players/editors
like VirtualDub work fine).
Fixes ticket #8333 and replaces/extends hack for ticket #2177
Signed-off-by: Marton Balint <cus at passwd.hu>
(cherry picked from commit 6ef5d8ca86c1d17e486300daa476dc6e0799f2f6)
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=76b5f726aa3b7827a00d2a65e9b4e55b29cabb5a
---
libavcodec/dv_profile.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/libavcodec/dv_profile.c b/libavcodec/dv_profile.c
index 66505c886b..0fc227dd04 100644
--- a/libavcodec/dv_profile.c
+++ b/libavcodec/dv_profile.c
@@ -261,24 +261,22 @@ const AVDVProfile* ff_dv_frame_profile(AVCodecContext* codec, const AVDVProfile
const uint8_t *frame, unsigned buf_size)
{
#if CONFIG_DVPROFILE
- int i, dsf, stype;
+ int i, dsf, stype, pal;
if(buf_size < DV_PROFILE_BYTES)
return NULL;
dsf = (frame[3] & 0x80) >> 7;
stype = frame[80 * 5 + 48 + 3] & 0x1f;
+ pal = !!(frame[80 * 5 + 48 + 3] & 0x20);
/* 576i50 25Mbps 4:1:1 is a special case */
if ((dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) ||
(stype == 31 && codec && codec->codec_tag==AV_RL32("SL25") && codec->coded_width==720 && codec->coded_height==576))
return &dv_profiles[2];
- if( stype == 0
- && codec
- && (codec->codec_tag==AV_RL32("dvsd") || codec->codec_tag==AV_RL32("CDVC"))
- && codec->coded_width ==720
- && codec->coded_height==576)
+ /* hack for trac issues #8333 and #2177, PAL DV files with dsf flag 0 - detect via pal flag and buf_size */
+ if (dsf == 0 && pal == 1 && stype == dv_profiles[1].video_stype && buf_size == dv_profiles[1].frame_size)
return &dv_profiles[1];
for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++)
More information about the ffmpeg-cvslog
mailing list