X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fxsubenc.c;h=03d0dc2d869b3dc13291743a04724e37e00009ed;hb=a247ac640df3da573cd661065bf53f37863e2b46;hp=b3da909679df252f850e1035a0b73630980e85c3;hpb=2ac399d7faa5ac80088715780769522d1141b549;p=ffmpeg diff --git a/libavcodec/xsubenc.c b/libavcodec/xsubenc.c index b3da909679d..03d0dc2d869 100644 --- a/libavcodec/xsubenc.c +++ b/libavcodec/xsubenc.c @@ -22,6 +22,7 @@ #include "avcodec.h" #include "bytestream.h" +#include "internal.h" #include "put_bits.h" /** @@ -62,8 +63,8 @@ static int xsub_encode_rle(PutBitContext *pb, const uint8_t *bitmap, 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; @@ -90,7 +91,7 @@ static int xsub_encode_rle(PutBitContext *pb, const uint8_t *bitmap, 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; } @@ -124,30 +125,17 @@ static int xsub_encode(AVCodecContext *avctx, unsigned char *buf, 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 @@ -160,7 +148,7 @@ FF_ENABLE_DEPRECATION_WARNINGS 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, @@ -195,23 +183,22 @@ FF_ENABLE_DEPRECATION_WARNINGS 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) @@ -224,11 +211,12 @@ 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, };