#include "avcodec.h"
#include "bytestream.h"
+#include "internal.h"
#include "put_bits.h"
/**
x0 = 0;
while (x0 < w) {
// Make sure we have enough room for at least one run and padding
- if (pb->size_in_bits - put_bits_count(pb) < 7*8)
- return -1;
+ if (put_bytes_left(pb, 1) < 7)
+ return AVERROR_BUFFER_TOO_SMALL;
x1 = x0;
color = bitmap[x1++] & 3;
if (color != PADDING_COLOR && (PADDING + (w&1)))
put_xsub_rle(pb, PADDING + (w&1), PADDING_COLOR);
- avpriv_align_put_bits(pb);
+ align_put_bits(pb);
bitmap += linesize;
}
if (bufsize < 27 + 7*2 + 4*3) {
av_log(avctx, AV_LOG_ERROR, "Buffer too small for XSUB header.\n");
- return -1;
+ return AVERROR_BUFFER_TOO_SMALL;
}
// TODO: support multiple rects
if (h->num_rects != 1)
av_log(avctx, AV_LOG_WARNING, "Only single rects supported (%d in subtitle.)\n", h->num_rects);
-#if FF_API_AVPICTURE
-FF_DISABLE_DEPRECATION_WARNINGS
- if (!h->rects[0]->data[0]) {
- AVSubtitleRect *rect = h->rects[0];
- int j;
- for (j = 0; j < 4; j++) {
- rect->data[j] = rect->pict.data[j];
- rect->linesize[j] = rect->pict.linesize[j];
- }
- }
-FF_ENABLE_DEPRECATION_WARNINGS
-#endif
-
// TODO: render text-based subtitles into bitmaps
if (!h->rects[0]->data[0] || !h->rects[0]->data[1]) {
av_log(avctx, AV_LOG_WARNING, "No subtitle bitmap available.\n");
- return -1;
+ return AVERROR(EINVAL);
}
// TODO: color reduction, similar to dvdsub encoder
if (make_tc(startTime, start_tc) || make_tc(endTime, end_tc)) {
av_log(avctx, AV_LOG_WARNING, "Time code >= 100 hours.\n");
- return -1;
+ return AVERROR(EINVAL);
}
snprintf(buf, 28,
if (xsub_encode_rle(&pb, h->rects[0]->data[0],
h->rects[0]->linesize[0] * 2,
h->rects[0]->w, (h->rects[0]->h + 1) >> 1))
- return -1;
- bytestream_put_le16(&rlelenptr, put_bits_count(&pb) >> 3); // Length of first field
+ return AVERROR_BUFFER_TOO_SMALL;
+ bytestream_put_le16(&rlelenptr, put_bytes_count(&pb, 0)); // Length of first field
if (xsub_encode_rle(&pb, h->rects[0]->data[0] + h->rects[0]->linesize[0],
h->rects[0]->linesize[0] * 2,
h->rects[0]->w, h->rects[0]->h >> 1))
- return -1;
+ return AVERROR_BUFFER_TOO_SMALL;
// Enforce total height to be a multiple of 2
if (h->rects[0]->h & 1) {
put_xsub_rle(&pb, h->rects[0]->w, PADDING_COLOR);
- avpriv_align_put_bits(&pb);
}
flush_put_bits(&pb);
- return hdr - buf + put_bits_count(&pb)/8;
+ return hdr - buf + put_bytes_output(&pb);
}
static av_cold int xsub_encoder_init(AVCodecContext *avctx)
return 0;
}
-AVCodec ff_xsub_encoder = {
+const AVCodec ff_xsub_encoder = {
.name = "xsub",
.long_name = NULL_IF_CONFIG_SMALL("DivX subtitles (XSUB)"),
.type = AVMEDIA_TYPE_SUBTITLE,
.id = AV_CODEC_ID_XSUB,
.init = xsub_encoder_init,
.encode_sub = xsub_encode,
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
};