[FFmpeg-devel] [PATCH] Add support for Display Definition Segment to DVB Subtitle encoder

2019-07-11 Thread mikrohard
Current version of dvbsub encoder doesn't support HD DVB subtitles. The high 
resolution bitmaps are muxed into the stream but without the DDS (display 
definition segment) the players asume that the DVB subtitles are in SD 
(720x576) resolution which causes them to either render the subtitles too large 
and misplaced or don't render them at all. By including the DDS as defined in 
section 7.7.1 of ETSI EN 300 743 (V1.3.1) this problem is fixed.

7.2.1 Display definition segment
The display definition for a subtitle service may be defined by the display 
definition segment if present in the stream.
Absence of a DDS implies that the stream is coded in accordance with EN 300 743 
(V1.2.1) [5] and that a display width of 720 pixels and a display height of 576 
lines may be assumed.

https://www.etsi.org/deliver/etsi_en/300700_300799/300743/01.03.01_60/en_300743v010301p.pdf

Signed-off-by: Jernej Fijacko 
---
 libavcodec/dvbsub.c | 18 --
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/libavcodec/dvbsub.c b/libavcodec/dvbsub.c
index 8cce702..c838567 100644
--- a/libavcodec/dvbsub.c
+++ b/libavcodec/dvbsub.c
@@ -247,7 +247,8 @@ static void dvb_encode_rle8(uint8_t **pq,
 *pq = q;
 }
 
-static int encode_dvb_subtitles(DVBSubtitleContext *s,
+static int encode_dvb_subtitles(AVCodecContext *avctx,
+DVBSubtitleContext *s,
 uint8_t *outbuf, const AVSubtitle *h)
 {
 uint8_t *q, *pseg_len;
@@ -261,6 +262,19 @@ static int encode_dvb_subtitles(DVBSubtitleContext *s,
 if (h->num_rects && !h->rects)
 return -1;
 
+if (avctx->width > 0 && avctx->height > 0) {
+/* display definition segment */
+*q++ = 0x0f; /* sync_byte */
+*q++ = 0x14; /* segment_type */
+bytestream_put_be16(&q, page_id);
+pseg_len = q;
+q += 2; /* segment length */
+*q++ = 0x20; /* dds version number & display window flag */
+bytestream_put_be16(&q, avctx->width - 1); /* display width */
+bytestream_put_be16(&q, avctx->height - 1); /* display height */
+bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+}
+
 /* page composition segment */
 
 *q++ = 0x0f; /* sync_byte */
@@ -449,7 +463,7 @@ static int dvbsub_encode(AVCodecContext *avctx,
 DVBSubtitleContext *s = avctx->priv_data;
 int ret;
 
-ret = encode_dvb_subtitles(s, buf, sub);
+ret = encode_dvb_subtitles(avctx, s, buf, sub);
 return ret;
 }
 
-- 
2.10.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH] Add support for Display Definition Segment to DVB Subtitle

2019-07-12 Thread mikrohard
From: Jernej 

Patch with requested changes.

---
 libavcodec/dvbsub.c | 19 ---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/libavcodec/dvbsub.c b/libavcodec/dvbsub.c
index 8cce702..a8d43d8 100644
--- a/libavcodec/dvbsub.c
+++ b/libavcodec/dvbsub.c
@@ -247,9 +247,10 @@ static void dvb_encode_rle8(uint8_t **pq,
 *pq = q;
 }
 
-static int encode_dvb_subtitles(DVBSubtitleContext *s,
+static int encode_dvb_subtitles(AVCodecContext *avctx,
 uint8_t *outbuf, const AVSubtitle *h)
 {
+DVBSubtitleContext *s = avctx->priv_data;
 uint8_t *q, *pseg_len;
 int page_id, region_id, clut_id, object_id, i, bpp_index, page_state;
 
@@ -261,6 +262,19 @@ static int encode_dvb_subtitles(DVBSubtitleContext *s,
 if (h->num_rects && !h->rects)
 return -1;
 
+if (avctx->width > 0 && avctx->height > 0) {
+/* display definition segment */
+*q++ = 0x0f; /* sync_byte */
+*q++ = 0x14; /* segment_type */
+bytestream_put_be16(&q, page_id);
+pseg_len = q;
+q += 2; /* segment length */
+*q++ = 0x00; /* dds version number & display window flag */
+bytestream_put_be16(&q, avctx->width - 1); /* display width */
+bytestream_put_be16(&q, avctx->height - 1); /* display height */
+bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+}
+
 /* page composition segment */
 
 *q++ = 0x0f; /* sync_byte */
@@ -446,10 +460,9 @@ static int dvbsub_encode(AVCodecContext *avctx,
  unsigned char *buf, int buf_size,
  const AVSubtitle *sub)
 {
-DVBSubtitleContext *s = avctx->priv_data;
 int ret;
 
-ret = encode_dvb_subtitles(s, buf, sub);
+ret = encode_dvb_subtitles(avctx, buf, sub);
 return ret;
 }
 
-- 
2.10.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH] Add support for Display Definition Segment to DVB Subtitle encoder

2019-07-13 Thread mikrohard
From: Jernej Fijacko 

Current version of dvbsub encoder doesn't support HD DVB subtitles. The high
resolution bitmaps are muxed into the stream but without the DDS (display 
definition
segment) the players asume that the DVB subtitles are in SD (720x576) resolution
which causes them to either render the subtitles too large and misplaced or 
don't
render them at all. By including the DDS as defined in section 7.7.1 of ETSI EN 
300
743 (V1.3.1) this problem is fixed.

7.2.1 Display definition segment The display definition for a subtitle service 
may
be defined by the display definition segment if present in the stream. Absence 
of a
DDS implies that the stream is coded in accordance with EN 300 743 (V1.2.1) [5] 
and
that a display width of 720 pixels and a display height of 576 lines may be 
assumed.

https://www.etsi.org/deliver/etsi_en/300700_300799/300743/01.03.01_60/en_300743v010301p.pdf

Signed-off-by: Jernej Fijacko 
---
 libavcodec/dvbsub.c | 19 ---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/libavcodec/dvbsub.c b/libavcodec/dvbsub.c
index 8cce702..a8d43d8 100644
--- a/libavcodec/dvbsub.c
+++ b/libavcodec/dvbsub.c
@@ -247,9 +247,10 @@ static void dvb_encode_rle8(uint8_t **pq,
 *pq = q;
 }
 
-static int encode_dvb_subtitles(DVBSubtitleContext *s,
+static int encode_dvb_subtitles(AVCodecContext *avctx,
 uint8_t *outbuf, const AVSubtitle *h)
 {
+DVBSubtitleContext *s = avctx->priv_data;
 uint8_t *q, *pseg_len;
 int page_id, region_id, clut_id, object_id, i, bpp_index, page_state;
 
@@ -261,6 +262,19 @@ static int encode_dvb_subtitles(DVBSubtitleContext *s,
 if (h->num_rects && !h->rects)
 return -1;
 
+if (avctx->width > 0 && avctx->height > 0) {
+/* display definition segment */
+*q++ = 0x0f; /* sync_byte */
+*q++ = 0x14; /* segment_type */
+bytestream_put_be16(&q, page_id);
+pseg_len = q;
+q += 2; /* segment length */
+*q++ = 0x00; /* dds version number & display window flag */
+bytestream_put_be16(&q, avctx->width - 1); /* display width */
+bytestream_put_be16(&q, avctx->height - 1); /* display height */
+bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+}
+
 /* page composition segment */
 
 *q++ = 0x0f; /* sync_byte */
@@ -446,10 +460,9 @@ static int dvbsub_encode(AVCodecContext *avctx,
  unsigned char *buf, int buf_size,
  const AVSubtitle *sub)
 {
-DVBSubtitleContext *s = avctx->priv_data;
 int ret;
 
-ret = encode_dvb_subtitles(s, buf, sub);
+ret = encode_dvb_subtitles(avctx, buf, sub);
 return ret;
 }
 
-- 
2.10.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".