}
if (cc_data_len / 3 > cc_count) {
- GST_ERROR_OBJECT (self, "Too many cc_data triplet for framerate: %u > %u",
+ GST_WARNING_OBJECT (self, "Too many cc_data triplet for framerate: %u > %u",
cc_data_len / 3, cc_count);
- return -1;
+ cc_data_len = 3 * cc_count;
}
/* ccdata_present | caption_service_active */
n = gst_buffer_get_size (inbuf);
if (n & 1) {
- GST_ERROR_OBJECT (self, "Invalid raw CEA608 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid raw CEA608 buffer size");
+ gst_buffer_set_size (outbuf, 0);
+ return GST_FLOW_OK;
}
n /= 2;
if (n > 3) {
- GST_ERROR_OBJECT (self, "Too many CEA608 pairs %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many CEA608 pairs %u", n);
+ n = 3;
}
gst_buffer_set_size (outbuf, 3 * n);
n = gst_buffer_get_size (inbuf);
if (n & 1) {
- GST_ERROR_OBJECT (self, "Invalid raw CEA608 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid raw CEA608 buffer size");
+ gst_buffer_set_size (outbuf, 0);
+ return GST_FLOW_OK;
}
n /= 2;
if (n > 3) {
- GST_ERROR_OBJECT (self, "Too many CEA608 pairs %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many CEA608 pairs %u", n);
+ n = 3;
}
gst_buffer_set_size (outbuf, 3 * n);
n = gst_buffer_get_size (inbuf);
if (n & 1) {
- GST_ERROR_OBJECT (self, "Invalid raw CEA608 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid raw CEA608 buffer size");
+ gst_buffer_set_size (outbuf, 0);
+ return GST_FLOW_OK;
}
n /= 2;
if (n > 3) {
- GST_ERROR_OBJECT (self, "Too many CEA608 pairs %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many CEA608 pairs %u", n);
+ n = 3;
}
gst_buffer_map (inbuf, &in, GST_MAP_READ);
gst_buffer_unmap (inbuf, &in);
gst_buffer_unmap (outbuf, &out);
- if (len == -1)
- return GST_FLOW_ERROR;
-
gst_buffer_set_size (outbuf, len);
return GST_FLOW_OK;
n = gst_buffer_get_size (inbuf);
if (n % 3 != 0) {
- GST_ERROR_OBJECT (self, "Invalid S334-1A CEA608 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid S334-1A CEA608 buffer size");
+ n = n - (n % 3);
}
n /= 3;
if (n > 3) {
- GST_ERROR_OBJECT (self, "Too many S334-1A CEA608 triplets %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many S334-1A CEA608 triplets %u", n);
+ n = 3;
}
gst_buffer_map (inbuf, &in, GST_MAP_READ);
n = gst_buffer_get_size (inbuf);
if (n % 3 != 0) {
- GST_ERROR_OBJECT (self, "Invalid S334-1A CEA608 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid S334-1A CEA608 buffer size");
+ n = n - (n % 3);
}
n /= 3;
if (n > 3) {
- GST_ERROR_OBJECT (self, "Too many S334-1A CEA608 triplets %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many S334-1A CEA608 triplets %u", n);
+ n = 3;
}
gst_buffer_set_size (outbuf, 3 * n);
n = gst_buffer_get_size (inbuf);
if (n % 3 != 0) {
- GST_ERROR_OBJECT (self, "Invalid S334-1A CEA608 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid S334-1A CEA608 buffer size");
+ n = n - (n % 3);
}
n /= 3;
if (n > 3) {
- GST_ERROR_OBJECT (self, "Too many S334-1A CEA608 triplets %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many S334-1A CEA608 triplets %u", n);
+ n = 3;
}
gst_buffer_map (inbuf, &in, GST_MAP_READ);
gst_buffer_unmap (inbuf, &in);
gst_buffer_unmap (outbuf, &out);
- if (len == -1)
- return GST_FLOW_ERROR;
-
gst_buffer_set_size (outbuf, len);
return GST_FLOW_OK;
n = gst_buffer_get_size (inbuf);
if (n % 3 != 0) {
- GST_ERROR_OBJECT (self, "Invalid raw CEA708 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid raw CEA708 buffer size");
+ n = n - (n % 3);
}
n /= 3;
if (n > 25) {
- GST_ERROR_OBJECT (self, "Too many CEA708 triplets %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many CEA708 triplets %u", n);
+ n = 25;
}
gst_buffer_map (inbuf, &in, GST_MAP_READ);
n = gst_buffer_get_size (inbuf);
if (n % 3 != 0) {
- GST_ERROR_OBJECT (self, "Invalid raw CEA708 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid raw CEA708 buffer size");
+ n = n - (n % 3);
}
n /= 3;
if (n > 25) {
- GST_ERROR_OBJECT (self, "Too many CEA708 triplets %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many CEA708 triplets %u", n);
+ n = 25;
}
gst_buffer_map (inbuf, &in, GST_MAP_READ);
n = gst_buffer_get_size (inbuf);
if (n % 3 != 0) {
- GST_ERROR_OBJECT (self, "Invalid raw CEA708 buffer size");
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Invalid raw CEA708 buffer size");
+ n = n - (n % 3);
}
n /= 3;
if (n > 25) {
- GST_ERROR_OBJECT (self, "Too many CEA708 triplets %u", n);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many CEA708 triplets %u", n);
+ n = 25;
}
gst_buffer_map (inbuf, &in, GST_MAP_READ);
gst_buffer_unmap (inbuf, &in);
gst_buffer_unmap (outbuf, &out);
- if (len == -1)
- return GST_FLOW_ERROR;
-
gst_buffer_set_size (outbuf, len);
return GST_FLOW_OK;
len /= 3;
if (len > 25) {
- GST_ERROR_OBJECT (self, "Too many cc_data triples in CDP packet %u", len);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many cc_data triples in CDP packet %u", len);
+ len = 25;
}
for (i = 0; i < len; i++) {
len /= 3;
if (len > 25) {
- GST_ERROR_OBJECT (self, "Too many cc_data triples in CDP packet %u", len);
- return GST_FLOW_ERROR;
+ GST_WARNING_OBJECT (self, "Too many cc_data triples in CDP packet %u", len);
+ len = 25;
}
for (i = 0; i < len; i++) {
gst_buffer_unmap (outbuf, &out);
if (len / 3 > 25) {
- GST_ERROR_OBJECT (self, "Too many cc_data triples in CDP packet %u",
+ GST_WARNING_OBJECT (self, "Too many cc_data triples in CDP packet %u",
len / 3);
- return GST_FLOW_ERROR;
+ len = 3 * 25;
}
gst_buffer_set_size (outbuf, len);
GST_END_TEST;
+GST_START_TEST (convert_cea608_s334_1a_cea608_raw_too_big)
+{
+ const guint8 in[] =
+ { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80,
+ 0x80
+ };
+ const guint8 out[] = { 0x80, 0x80, 0x80, 0x80 };
+ check_conversion (in, sizeof (in), out, sizeof (out),
+ "closedcaption/x-cea-608,format=(string)s334-1a",
+ "closedcaption/x-cea-608,format=(string)raw");
+}
+
+GST_END_TEST;
+
GST_START_TEST (convert_cea608_s334_1a_cea708_cc_data)
{
const guint8 in[] = { 0x80, 0x80, 0x80, 0x00, 0x80, 0x80 };
tcase_add_test (tc, convert_cea608_raw_cea708_cc_data);
tcase_add_test (tc, convert_cea608_raw_cea708_cdp);
tcase_add_test (tc, convert_cea608_s334_1a_cea608_raw);
+ tcase_add_test (tc, convert_cea608_s334_1a_cea608_raw_too_big);
tcase_add_test (tc, convert_cea608_s334_1a_cea708_cc_data);
tcase_add_test (tc, convert_cea608_s334_1a_cea708_cdp);
tcase_add_test (tc, convert_cea708_cc_data_cea608_raw);