[FFmpeg-devel] [PATCH] Pass "forced" flag to dvdsubenc

Oliver Fromme oliver at fromme.com
Sun May 18 15:29:28 CEST 2014


I hope this is the right place to submit a patch.
Please let me know if there's something wrong with it.
The patch was made against a recent snapshot downloaded
from ffmpeg.org on 2014-05-16.  I'm not familiar with
git at all (my version-control background is rather cvs,
subversion and perforce), so I just used "diff -u".
The patch is fairly trivial and small, so it shouldn't
be an issue.

The problem is that I'm working with a lot with subtitle
tracks that are either completely forced or that contain
some captions that are forced (and some that are not).
At the moment, ffmpeg and libavcodec don't support this
very well.  I'll try to improve this in small steps.

My first observation when looking at the source code was
that there is already a flag:  AV_SUBTITLE_FLAG_FORCED.
However, at the moment this flag is only set by pgssubdec
dvdsubdec, but it is never used anywhere.  That means,
if subtitles are read from a PGS or VOBSUB track and
then later written to the destination file, the "forced"
flag is lost.

The patch presented below causes the flag to be used when
writing a VOBSUB track ("dvdsub" in ffmpeg parlance), so
the flag is preserved.  I've tested the patch with various
VOBSUB tracks successfully.

By the way, a good way for testing VOBSUB subtitles files
(i.e. pairs of *.idx and *.sub files) is the BDSup2Sub
utility.  It's written in Java and supports both a GUI
and a pure command-line interface (I only use the latter).
The good thing about it is that it has a very strict
parser.  If anything is wrong with the VOBSUB input, it
prints appropriate warnings and error messages.  It also
prints the number of captions marked as forced, and allows
to extract them separately.  ffmpeg doesn't support this
yet, but I'll try to implement something like that when
I have some spare time.  Yes, I know, there already is the
-forced_subs_only option, but it's specific to the PGS
decoder, and it doesn't work anyway because of a bug.

Best regards

PS:  Here's the patch to use the "forced" flag in dvdsubenc:

--- libavcodec/dvdsubenc.c.orig	2014-04-25 19:20:06.000000000 +0200
+++ libavcodec/dvdsubenc.c	2014-05-16 23:35:29.000000000 +0200
@@ -259,6 +259,7 @@
     AVSubtitleRect vrect;
     uint8_t *vrect_data = NULL;
     int x2, y2;
+    int forced = 0;
     if (rects == 0 || h->rects == NULL)
         return AVERROR(EINVAL);
@@ -267,6 +268,12 @@
             av_log(avctx, AV_LOG_ERROR, "Bitmap subtitle required\n");
             return AVERROR(EINVAL);
+    /* Mark this subtitle forced if any of the rectangles is forced. */
+    for (i = 0; i < rects; i++)
+        if ((h->rects[i]->flags & AV_SUBTITLE_FLAG_FORCED) != 0) {
+            forced = 1;
+            break;
+        }
     vrect = *h->rects[0];
     if (rects > 1) {
@@ -371,7 +378,7 @@
     bytestream_put_be16(&q, offset1);
     bytestream_put_be16(&q, offset2);
-    *q++ = 0x01; // start command
+    *q++ = forced ? 0x00 : 0x01; // start command
     *q++ = 0xff; // terminating command
     // send stop display command last

More information about the ffmpeg-devel mailing list