summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-12-29 14:07:08 +0100
committerwm4 <wm4@nowhere>2013-12-29 14:19:22 +0100
commit392856ed4d86c71ecfb9b8036351ba2acd825a32 (patch)
tree60983b1bfb29a0ee6838364d068c6e52ae719761
parent15f38b89eeb7cbb72a84dabc19b706ede455399c (diff)
downloadmpv-392856ed4d86c71ecfb9b8036351ba2acd825a32.tar.bz2
mpv-392856ed4d86c71ecfb9b8036351ba2acd825a32.tar.xz
vd_lavc: by default, output all frames, even corrupted ones
Set the flag CODEC_FLAG_OUTPUT_CORRUPT by default. Note that there is also CODEC_FLAG2_SHOW_ALL, which is older, but this seems to be ffmpeg only. Note that whether you want this enabled depends on the user. Some might prefer that only good frames are output, while others want the decoder to try as hard as possible to output _anything_. Since mplayer/mpv is rather the kind of player that tries hard instead of being "clever", set the new default to override libavcodec's default. A nice way to test this is switching video tracks. Since mpv doesn't wait for the next key frame, it'll start feeding the decoder with a packet from the middle of the stream.
-rw-r--r--DOCS/man/en/options.rst5
-rw-r--r--options/options.c1
-rw-r--r--options/options.h1
-rw-r--r--video/decode/vd_lavc.c10
4 files changed, 17 insertions, 0 deletions
diff --git a/DOCS/man/en/options.rst b/DOCS/man/en/options.rst
index b2f9d30b68..7803e98b5c 100644
--- a/DOCS/man/en/options.rst
+++ b/DOCS/man/en/options.rst
@@ -2631,6 +2631,11 @@ OPTIONS
``--vd--lavc-o=debug=pict``
+``--vd-lavc-show-all=<yes|no>``
+ Show even broken/corrupt frames (default: yes). If this option is set to
+ no, libavcodec won't output frames that were either decoded before an
+ initial keyframe was decoded, or frames that are recognized as corrupted.
+
``--vd-lavc-skiploopfilter=<skipvalue> (H.264 only)``
Skips the loop filter (AKA deblocking) during H.264 decoding. Since
the filtered frame is supposed to be used as reference for decoding
diff --git a/options/options.c b/options/options.c
index f53f33245e..a92ace3ec0 100644
--- a/options/options.c
+++ b/options/options.c
@@ -755,6 +755,7 @@ const struct MPOpts mp_default_opts = {
.allow_mimetype = 1,
},
.lavc_param = {
+ .show_all = 1,
.check_hw_profile = 1,
},
.input = {
diff --git a/options/options.h b/options/options.h
index 6e44dc838c..b4366a2f2e 100644
--- a/options/options.h
+++ b/options/options.h
@@ -228,6 +228,7 @@ typedef struct MPOpts {
struct lavc_param {
int fast;
+ int show_all;
char *skip_loop_filter_str;
char *skip_idct_str;
char *skip_frame_str;
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 7530eb0fa5..dcd208ad10 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -73,6 +73,7 @@ static void uninit(struct dec_video *vd);
const m_option_t lavc_decode_opts_conf[] = {
OPT_FLAG_CONSTANTS("fast", lavc_param.fast, 0, 0, CODEC_FLAG2_FAST),
+ OPT_FLAG("show-all", lavc_param.show_all, 0),
OPT_STRING("skiploopfilter", lavc_param.skip_loop_filter_str, 0),
OPT_STRING("skipidct", lavc_param.skip_idct_str, 0),
OPT_STRING("skipframe", lavc_param.skip_frame_str, 0),
@@ -421,6 +422,15 @@ static void init_avctx(struct dec_video *vd, const char *decoder,
avctx->flags |= lavc_param->bitexact;
avctx->flags2 |= lavc_param->fast;
+ if (lavc_param->show_all) {
+#ifdef CODEC_FLAG2_SHOW_ALL
+ avctx->flags2 |= CODEC_FLAG2_SHOW_ALL; // ffmpeg only?
+#endif
+#ifdef CODEC_FLAG_OUTPUT_CORRUPT
+ avctx->flags |= CODEC_FLAG_OUTPUT_CORRUPT; // added with Libav 10
+#endif
+ }
+
avctx->skip_loop_filter = str2AVDiscard(vd, lavc_param->skip_loop_filter_str);
avctx->skip_idct = str2AVDiscard(vd, lavc_param->skip_idct_str);
avctx->skip_frame = str2AVDiscard(vd, lavc_param->skip_frame_str);