mirror of https://git.ffmpeg.org/ffmpeg.git
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@passwd.hu>
This commit is contained in:
parent
62f486e793
commit
6ef5d8ca86
|
@ -261,24 +261,22 @@ const AVDVProfile* ff_dv_frame_profile(AVCodecContext* codec, const AVDVProfile
|
||||||
const uint8_t *frame, unsigned buf_size)
|
const uint8_t *frame, unsigned buf_size)
|
||||||
{
|
{
|
||||||
#if CONFIG_DVPROFILE
|
#if CONFIG_DVPROFILE
|
||||||
int i, dsf, stype;
|
int i, dsf, stype, pal;
|
||||||
|
|
||||||
if(buf_size < DV_PROFILE_BYTES)
|
if(buf_size < DV_PROFILE_BYTES)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
dsf = (frame[3] & 0x80) >> 7;
|
dsf = (frame[3] & 0x80) >> 7;
|
||||||
stype = frame[80 * 5 + 48 + 3] & 0x1f;
|
stype = frame[80 * 5 + 48 + 3] & 0x1f;
|
||||||
|
pal = !!(frame[80 * 5 + 48 + 3] & 0x20);
|
||||||
|
|
||||||
/* 576i50 25Mbps 4:1:1 is a special case */
|
/* 576i50 25Mbps 4:1:1 is a special case */
|
||||||
if ((dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) ||
|
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))
|
(stype == 31 && codec && codec->codec_tag==AV_RL32("SL25") && codec->coded_width==720 && codec->coded_height==576))
|
||||||
return &dv_profiles[2];
|
return &dv_profiles[2];
|
||||||
|
|
||||||
if( stype == 0
|
/* hack for trac issues #8333 and #2177, PAL DV files with dsf flag 0 - detect via pal flag and buf_size */
|
||||||
&& codec
|
if (dsf == 0 && pal == 1 && stype == dv_profiles[1].video_stype && buf_size == dv_profiles[1].frame_size)
|
||||||
&& (codec->codec_tag==AV_RL32("dvsd") || codec->codec_tag==AV_RL32("CDVC"))
|
|
||||||
&& codec->coded_width ==720
|
|
||||||
&& codec->coded_height==576)
|
|
||||||
return &dv_profiles[1];
|
return &dv_profiles[1];
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++)
|
for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++)
|
||||||
|
|
Loading…
Reference in New Issue