Skip to content

Commit a11b7a8

Browse files
committed
Merge pull request opencv#10916 from alalek:videoio_sample_aspect_ratio
2 parents e606253 + 9819ebc commit a11b7a8

File tree

2 files changed

+31
-26
lines changed

2 files changed

+31
-26
lines changed

modules/videoio/include/opencv2/videoio.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,12 @@ enum VideoCaptureProperties {
164164
CAP_PROP_IRIS =36,
165165
CAP_PROP_SETTINGS =37, //!< Pop up video/camera filter dialog (note: only supported by DSHOW backend currently. The property value is ignored)
166166
CAP_PROP_BUFFERSIZE =38,
167-
CAP_PROP_AUTOFOCUS =39
167+
CAP_PROP_AUTOFOCUS =39,
168+
CAP_PROP_SAR_NUM =40, //!< Sample aspect ratio: num/den (num)
169+
CAP_PROP_SAR_DEN =41, //!< Sample aspect ratio: num/den (den)
170+
#ifndef CV_DOXYGEN
171+
CV__CAP_PROP_LATEST
172+
#endif
168173
};
169174

170175

modules/videoio/src/cap_ffmpeg_impl.hpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,29 @@ inline int _opencv_ffmpeg_av_image_get_buffer_size(enum AVPixelFormat pix_fmt, i
406406
#endif
407407
};
408408

409+
static AVRational _opencv_ffmpeg_get_sample_aspect_ratio(AVStream *stream)
410+
{
411+
#if LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(54, 5, 100)
412+
return av_guess_sample_aspect_ratio(NULL, stream, NULL);
413+
#else
414+
AVRational undef = {0, 1};
415+
416+
// stream
417+
AVRational ratio = stream ? stream->sample_aspect_ratio : undef;
418+
av_reduce(&ratio.num, &ratio.den, ratio.num, ratio.den, INT_MAX);
419+
if (ratio.num > 0 && ratio.den > 0)
420+
return ratio;
421+
422+
// codec
423+
ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
424+
av_reduce(&ratio.num, &ratio.den, ratio.num, ratio.den, INT_MAX);
425+
if (ratio.num > 0 && ratio.den > 0)
426+
return ratio;
427+
428+
return undef;
429+
#endif
430+
}
431+
409432

410433
struct CvCapture_FFMPEG
411434
{
@@ -427,7 +450,6 @@ struct CvCapture_FFMPEG
427450
double get_duration_sec() const;
428451
double get_fps() const;
429452
int get_bitrate() const;
430-
AVRational get_sample_aspect_ratio(AVStream *stream) const;
431453

432454
double r2d(AVRational r) const;
433455
int64_t dts_to_frame_number(int64_t dts);
@@ -1089,9 +1111,9 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
10891111
return (double)video_st->codec.codec_tag;
10901112
#endif
10911113
case CV_FFMPEG_CAP_PROP_SAR_NUM:
1092-
return get_sample_aspect_ratio(ic->streams[video_stream]).num;
1114+
return _opencv_ffmpeg_get_sample_aspect_ratio(ic->streams[video_stream]).num;
10931115
case CV_FFMPEG_CAP_PROP_SAR_DEN:
1094-
return get_sample_aspect_ratio(ic->streams[video_stream]).den;
1116+
return _opencv_ffmpeg_get_sample_aspect_ratio(ic->streams[video_stream]).den;
10951117
default:
10961118
break;
10971119
}
@@ -1164,28 +1186,6 @@ int64_t CvCapture_FFMPEG::dts_to_frame_number(int64_t dts)
11641186
return (int64_t)(get_fps() * sec + 0.5);
11651187
}
11661188

1167-
AVRational CvCapture_FFMPEG::get_sample_aspect_ratio(AVStream *stream) const
1168-
{
1169-
AVRational undef = {0, 1};
1170-
AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
1171-
AVRational frame_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
1172-
1173-
av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
1174-
stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
1175-
if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
1176-
stream_sample_aspect_ratio = undef;
1177-
1178-
av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
1179-
frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
1180-
if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
1181-
frame_sample_aspect_ratio = undef;
1182-
1183-
if (stream_sample_aspect_ratio.num)
1184-
return stream_sample_aspect_ratio;
1185-
else
1186-
return frame_sample_aspect_ratio;
1187-
}
1188-
11891189
double CvCapture_FFMPEG::dts_to_sec(int64_t dts)
11901190
{
11911191
return (double)(dts - ic->streams[video_stream]->start_time) *

0 commit comments

Comments
 (0)