summaryrefslogtreecommitdiffstats
path: root/contrib/ffmpeg/A07-movenc-Add-dvd-subtitle-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ffmpeg/A07-movenc-Add-dvd-subtitle-support.patch')
-rw-r--r--contrib/ffmpeg/A07-movenc-Add-dvd-subtitle-support.patch142
1 files changed, 0 insertions, 142 deletions
diff --git a/contrib/ffmpeg/A07-movenc-Add-dvd-subtitle-support.patch b/contrib/ffmpeg/A07-movenc-Add-dvd-subtitle-support.patch
deleted file mode 100644
index 9f604ecb9..000000000
--- a/contrib/ffmpeg/A07-movenc-Add-dvd-subtitle-support.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From 6adf3bc42e36242d487636786e995149bbb849fe Mon Sep 17 00:00:00 2001
-From: John Stebbins <[email protected]>
-Date: Tue, 18 Mar 2014 08:50:25 -0600
-Subject: [PATCH] movenc: Add dvd subtitle support
-
-Signed-off-by: Luca Barbato <[email protected]>
----
- libavformat/movenc.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++----
- 1 file changed, 78 insertions(+), 5 deletions(-)
-
-diff --git a/libavformat/movenc.c b/libavformat/movenc.c
-index 0c688f6..a6a55d5 100644
---- a/libavformat/movenc.c
-+++ b/libavformat/movenc.c
-@@ -309,7 +309,9 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
-
- // the following fields is made of 6 bits to identify the streamtype (4 for video, 5 for audio)
- // plus 1 bit to indicate upstream and 1 bit set to 1 (reserved)
-- if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO)
-+ if (track->enc->codec_id == AV_CODEC_ID_DVD_SUBTITLE)
-+ avio_w8(pb, (0x38 << 2) | 1); // flags (= NeroSubpicStream)
-+ else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO)
- avio_w8(pb, 0x15); // flags (= Audiostream)
- else
- avio_w8(pb, 0x11); // flags (= Visualstream)
-@@ -760,6 +762,7 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
- else if (track->enc->codec_id == AV_CODEC_ID_VC1) tag = MKTAG('v','c','-','1');
- else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) tag = MKTAG('m','p','4','v');
- else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) tag = MKTAG('m','p','4','a');
-+ else if (track->enc->codec_id == AV_CODEC_ID_DVD_SUBTITLE) tag = MKTAG('m','p','4','s');
-
- return tag;
- }
-@@ -976,7 +979,9 @@ static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track)
- avio_wb16(pb, 0); /* Reserved */
- avio_wb16(pb, 1); /* Data-reference index */
-
-- if (track->enc->extradata_size)
-+ if (track->enc->codec_id == AV_CODEC_ID_DVD_SUBTITLE)
-+ mov_write_esds_tag(pb, track);
-+ else if (track->enc->extradata_size)
- avio_write(pb, track->enc->extradata, track->enc->extradata_size);
-
- return update_size(pb, pos);
-@@ -1308,6 +1313,7 @@ static int mov_write_hdlr_tag(AVIOContext *pb, MOVTrack *track)
- descr = "SoundHandler";
- } else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) {
- if (track->tag == MKTAG('t','x','3','g')) hdlr_type = "sbtl";
-+ if (track->tag == MKTAG('m','p','4','s')) hdlr_type = "subp";
- else hdlr_type = "text";
- descr = "SubtitleHandler";
- } else if (track->enc->codec_tag == MKTAG('r','t','p',' ')) {
-@@ -3178,6 +3184,69 @@ static void mov_free(AVFormatContext *s)
- av_freep(&mov->tracks);
- }
-
-+static uint32_t rgb_to_yuv(uint32_t rgb)
-+{
-+ uint8_t r, g, b;
-+ int y, cb, cr;
-+
-+ r = (rgb >> 16) & 0xFF;
-+ g = (rgb >> 8) & 0xFF;
-+ b = (rgb ) & 0xFF;
-+
-+ y = av_clip_uint8( 16. + 0.257 * r + 0.504 * g + 0.098 * b);
-+ cb = av_clip_uint8(128. - 0.148 * r - 0.291 * g + 0.439 * b);
-+ cr = av_clip_uint8(128. + 0.439 * r - 0.368 * g - 0.071 * b);
-+
-+ return (y << 16) | (cr << 8) | cb;
-+}
-+
-+static int mov_create_dvd_sub_decoder_specific_info(MOVTrack *track,
-+ AVStream *st)
-+{
-+ int i, width = 720, height = 480;
-+ int have_palette = 0, have_size = 0;
-+ uint32_t palette[16];
-+ char *cur = st->codec->extradata;
-+
-+ while (cur && *cur) {
-+ if (strncmp("palette:", cur, 8) == 0) {
-+ int i, count;
-+ count = sscanf(cur + 8,
-+ "%06x, %06x, %06x, %06x, %06x, %06x, %06x, %06x, "
-+ "%06x, %06x, %06x, %06x, %06x, %06x, %06x, %06x",
-+ &palette[ 0], &palette[ 1], &palette[ 2], &palette[ 3],
-+ &palette[ 4], &palette[ 5], &palette[ 6], &palette[ 7],
-+ &palette[ 8], &palette[ 9], &palette[10], &palette[11],
-+ &palette[12], &palette[13], &palette[14], &palette[15]);
-+
-+ for (i = 0; i < count; i++) {
-+ palette[i] = rgb_to_yuv(palette[i]);
-+ }
-+ have_palette = 1;
-+ } else if (!strncmp("size:", cur, 5)) {
-+ sscanf(cur + 5, "%dx%d", &width, &height);
-+ have_size = 1;
-+ }
-+ if (have_palette && have_size)
-+ break;
-+ cur += strcspn(cur, "\n\r");
-+ cur += strspn(cur, "\n\r");
-+ }
-+ if (have_palette) {
-+ track->vos_data = av_malloc(16*4);
-+ if (!track->vos_data)
-+ return AVERROR(ENOMEM);
-+ for (i = 0; i < 16; i++) {
-+ AV_WB32(track->vos_data + i * 4, palette[i]);
-+ }
-+ track->vos_len = 16 * 4;
-+ }
-+ st->codec->width = width;
-+ st->codec->height = track->height = height;
-+
-+ return 0;
-+}
-+
- static int mov_write_header(AVFormatContext *s)
- {
- AVIOContext *pb = s->pb;
-@@ -3334,9 +3403,13 @@ static int mov_write_header(AVFormatContext *s)
-
- /* copy extradata if it exists */
- if (st->codec->extradata_size) {
-- track->vos_len = st->codec->extradata_size;
-- track->vos_data = av_malloc(track->vos_len);
-- memcpy(track->vos_data, st->codec->extradata, track->vos_len);
-+ if (st->codec->codec_id == AV_CODEC_ID_DVD_SUBTITLE)
-+ mov_create_dvd_sub_decoder_specific_info(track, st);
-+ else {
-+ track->vos_len = st->codec->extradata_size;
-+ track->vos_data = av_malloc(track->vos_len);
-+ memcpy(track->vos_data, st->codec->extradata, track->vos_len);
-+ }
- }
- }
-
---
-1.9.3
-