static int ass_encode_frame(AVCodecContext *avctx,

                            unsigned char *buf, int bufsize,

                            const AVSubtitle *sub)

{

    ASSEncodeContext *s = avctx->priv_data;

    int i, len, total_len = 0;



    for (i=0; i<sub->num_rects; i++) {

        char ass_line[2048];

        const char *ass = sub->rects[i]->ass;



        if (sub->rects[i]->type != SUBTITLE_ASS) {

            av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");

            return -1;

        }



        if (strncmp(ass, "Dialogue: ", 10)) {

            av_log(avctx, AV_LOG_ERROR, "AVSubtitle rectangle ass \"%s\""

                   " does not look like a SSA markup\n", ass);

            return AVERROR_INVALIDDATA;

        }



        if (avctx->codec->id == AV_CODEC_ID_ASS) {

            long int layer;

            char *p;



            if (i > 0) {

                av_log(avctx, AV_LOG_ERROR, "ASS encoder supports only one "

                       "ASS rectangle field.\n");

                return AVERROR_INVALIDDATA;

            }



            ass += 10; 

            





            layer = strtol(ass, &p, 10);

            if (*p) p += strcspn(p, ",") + 1; 

            if (*p) p += strcspn(p, ",") + 1; 

            if (*p) p += strcspn(p, ",") + 1; 

            snprintf(ass_line, sizeof(ass_line), "%d,%ld,%s", ++s->id, layer, p);

            ass_line[strcspn(ass_line, "\r\n")] = 0;

            ass = ass_line;

        }

        len = av_strlcpy(buf+total_len, ass, bufsize-total_len);



        if (len > bufsize-total_len-1) {

            av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");

            return -1;

        }



        total_len += len;

    }



    return total_len;

}
