From: Niklesh <niklesh.lalw...@iitb.ac.in>

This patch mostly replicates the concept patch posted by Philip 
https://ffmpeg.org/pipermail/ffmpeg-devel/2013-March/140299.html. This sets the 
proper dimensions for the subtitle tracks, by making use of the height and 
width of the video stream. The patch is exlained in detail in the link.

Signed-off-by: Niklesh <niklesh.lalw...@iitb.ac.in>
---
 libavformat/movenc.c | 38 ++++++++++++++++++++++++++++++++++----
 libavformat/movenc.h |  4 ++++
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index dc9570b..c55219e 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1505,8 +1505,20 @@ static int mov_write_subtitle_tag(AVIOContext *pb, 
MOVTrack *track)
 
     if (track->enc->codec_id == AV_CODEC_ID_DVD_SUBTITLE)
         mov_write_esds_tag(pb, track);
-    else if (track->enc->extradata_size)
+    else if (track->enc->extradata_size) {
+        if (track->enc->extradata_size >= 18) {
+            // Rewrite text box dimensions to match video stream.
+            uint8_t *ed = track->enc->extradata;
+            uint16_t width = track->video_width;
+            uint16_t height = track->video_height;
+            height /= 10;
+            ed[14] = height >> 8;
+            ed[15] = height & 0xFF;
+            ed[16] = width >> 8;
+            ed[17] = width & 0xFF;
+       }
         avio_write(pb, track->enc->extradata, track->enc->extradata_size);
+    }
 
     return update_size(pb, pos);
 }
@@ -2335,7 +2347,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, 
MOVMuxContext *mov,
 
     avio_wb32(pb, 0); /* reserved */
     avio_wb32(pb, 0); /* reserved */
-    avio_wb16(pb, 0); /* layer */
+    avio_wb16(pb, -1); /* layer */
     avio_wb16(pb, group); /* alternate group) */
     /* Volume, only for audio */
     if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO)
@@ -2352,6 +2364,8 @@ static int mov_write_tkhd_tag(AVIOContext *pb, 
MOVMuxContext *mov,
     if (display_matrix) {
         for (i = 0; i < 9; i++)
             avio_wb32(pb, display_matrix[i]);
+    } else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+        write_matrix(pb, 1, 0, 0, 1, 0, (track->video_height*9)/10);
     } else if (rotation == 90) {
         write_matrix(pb,  0,  1, -1,  0, track->enc->height, 0);
     } else if (rotation == 180) {
@@ -2362,8 +2376,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, 
MOVMuxContext *mov,
         write_matrix(pb,  1,  0,  0,  1, 0, 0);
     }
     /* Track width and height, for visual only */
-    if (st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO ||
-               track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE)) {
+    if (st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO)) {
         if (track->mode == MODE_MOV) {
             avio_wb32(pb, track->enc->width << 16);
             avio_wb32(pb, track->height << 16);
@@ -2374,6 +2387,9 @@ static int mov_write_tkhd_tag(AVIOContext *pb, 
MOVMuxContext *mov,
             avio_wb32(pb, sample_aspect_ratio * track->enc->width * 0x10000);
             avio_wb32(pb, track->height * 0x10000);
         }
+    } else if (st && track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+        avio_wb32(pb, track->video_width * 0x10000);
+        avio_wb32(pb, (track->video_height * 0x10000) / 10);
     } else {
         avio_wb32(pb, 0);
         avio_wb32(pb, 0);
@@ -5216,6 +5232,20 @@ static int mov_write_header(AVFormatContext *s)
         }
     }
 
+    for (i = 0; i < mov->nb_streams; i++) {
+        MOVTrack *track = &mov->tracks[i];
+        if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+            int j;
+            for (j = 0; j < mov->nb_streams; j++) {
+                if (mov->tracks[j].enc->codec_type == AVMEDIA_TYPE_VIDEO) {
+                    track->video_width = mov->tracks[j].enc->width;
+                    track->video_height = mov->tracks[j].enc->height;
+                    break;
+                }
+            }
+        }
+    }
+
     enable_tracks(s);
 
 
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index 744d14e..c89a59e 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -148,6 +148,10 @@ typedef struct MOVTrack {
         int     slices;
     } vc1_info;
 
+    // For subtitle tracks.
+    uint16_t video_width;
+    uint16_t video_height;
+
     void       *eac3_priv;
 } MOVTrack;
 
-- 
1.9.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to