From d3c475fa7ea0984b7f603b02d32eb59363f727f5 Mon Sep 17 00:00:00 2001
From: Alen Vrecko <alen.vrecko@fora.si>
Date: Mon, 17 Feb 2020 15:47:05 +0100
Subject: [PATCH] Change Dvb segment order to be in line with ETSI EN 300 743.
Having CLUT before Region Composition Segment caused problems on legacy STBs i.e. Amino A110.
In the ETSI EN 300 743 V1.6.1 (2018-10) section 4.4 it is written:
The order of their listing here matches their ordering, when present, in a display set:
display definition segment ...
page composition segment ...
region composition segment ...
disparity signalling segment ...
CLUT definition segment ...
alternative CLUT segment ...
object data segment ...
end of display set segment ...
It makes sense for this order to be respected by ffmpeg.
---
libavcodec/dvbsub.c | 80 ++++++++++++++++++++++----------------------
libavcodec/version.h | 2 +-
2 files changed, 41 insertions(+), 41 deletions(-)
@@ -296,6 +296,46 @@ static int encode_dvb_subtitles(AVCodecContext *avctx,
bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+ for (region_id = 0; region_id < h->num_rects; region_id++) {
+
+ /* region composition segment */
+
+ if (h->rects[region_id]->nb_colors <= 4) {
+ /* 2 bpp, some decoders do not support it correctly */
+ bpp_index = 0;
+ } else if (h->rects[region_id]->nb_colors <= 16) {
+ /* 4 bpp, standard encoding */
+ bpp_index = 1;
+ } else if (h->rects[region_id]->nb_colors <= 256) {
+ /* 8 bpp, standard encoding */
+ bpp_index = 2;
+ } else {
+ return -1;
+ }
+
+ *q++ = 0x0f; /* sync_byte */
+ *q++ = 0x11; /* segment_type */
+ bytestream_put_be16(&q, page_id);
+ pseg_len = q;
+ q += 2; /* segment length */
+ *q++ = region_id;
+ *q++ = (s->object_version << 4) | (0 << 3) | 0x07; /* version , no fill */
+ bytestream_put_be16(&q, h->rects[region_id]->w); /* region width */
+ bytestream_put_be16(&q, h->rects[region_id]->h); /* region height */
+ *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x03;
+ *q++ = region_id; /* clut_id == region_id */
+ *q++ = 0; /* 8 bit fill colors */
+ *q++ = 0x03; /* 4 bit and 2 bit fill colors */
+
+ bytestream_put_be16(&q, region_id); /* object_id == region_id */
+ *q++ = (0 << 6) | (0 << 4);
+ *q++ = 0;
+ *q++ = 0xf0;
+ *q++ = 0;
+
+ bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+ }
+
if (h->num_rects) {
for (clut_id = 0; clut_id < h->num_rects; clut_id++) {
@@ -346,46 +386,6 @@ static int encode_dvb_subtitles(AVCodecContext *avctx,
}
}
- for (region_id = 0; region_id < h->num_rects; region_id++) {
-
- /* region composition segment */
-
- if (h->rects[region_id]->nb_colors <= 4) {
- /* 2 bpp, some decoders do not support it correctly */
- bpp_index = 0;
- } else if (h->rects[region_id]->nb_colors <= 16) {
- /* 4 bpp, standard encoding */
- bpp_index = 1;
- } else if (h->rects[region_id]->nb_colors <= 256) {
- /* 8 bpp, standard encoding */
- bpp_index = 2;
- } else {
- return -1;
- }
-
- *q++ = 0x0f; /* sync_byte */
- *q++ = 0x11; /* segment_type */
- bytestream_put_be16(&q, page_id);
- pseg_len = q;
- q += 2; /* segment length */
- *q++ = region_id;
- *q++ = (s->object_version << 4) | (0 << 3) | 0x07; /* version , no fill */
- bytestream_put_be16(&q, h->rects[region_id]->w); /* region width */
- bytestream_put_be16(&q, h->rects[region_id]->h); /* region height */
- *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x03;
- *q++ = region_id; /* clut_id == region_id */
- *q++ = 0; /* 8 bit fill colors */
- *q++ = 0x03; /* 4 bit and 2 bit fill colors */
-
- bytestream_put_be16(&q, region_id); /* object_id == region_id */
- *q++ = (0 << 6) | (0 << 4);
- *q++ = 0;
- *q++ = 0xf0;
- *q++ = 0;
-
- bytestream_put_be16(&pseg_len, q - pseg_len - 2);
- }
-
if (h->num_rects) {
for (object_id = 0; object_id < h->num_rects; object_id++) {
@@ -29,7 +29,7 @@
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 70
-#define LIBAVCODEC_VERSION_MICRO 100
+#define LIBAVCODEC_VERSION_MICRO 101
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
--
2.21.1