示例#1
0
void data_to_manager(Context_t *context, char *Text, unsigned long long int Pts, double Duration)
{
	srt_printf(20, "--> Text= \"%s\"\n", Text);

	if (context &&
			context->playback &&
			context->playback->isPlaying && Text)
	{
		int sl = strlen(Text) - 1;
		while (sl >= 0 && (Text[sl] == '\n' || Text[sl] == '\r')) Text[sl--] = '\0'; /*Delete last \n or \r */
		unsigned char *line = text_to_ass(Text, Pts, Duration);
		if (line != NULL)
		{
			srt_printf(50, "Sub text is %s\n", Text);
			srt_printf(50, "Sub line is %s\n", line);
			SubtitleData_t data;
			data.data      = line;
			data.len       = strlen((char *)line);
			data.extradata = (unsigned char *) DEFAULT_ASS_HEAD;
			data.extralen  = strlen(DEFAULT_ASS_HEAD);
			data.pts       = Pts * 90;
			data.duration  = Duration;

			context->container->assContainer->Command(context, CONTAINER_DATA, &data);
			free(line);
		}
	}

	srt_printf(20, "<-- Text= \"%s\"\n", Text);
}
示例#2
0
static int mov_text_decode_frame(AVCodecContext *avctx,
                                 void *data, int *got_sub_ptr, AVPacket *avpkt)
{
  AVSubtitle *sub = data;
  int ts_start, ts_end;
  AVBPrint buf;
  const char *ptr = avpkt->data;
  const char *end;

  if (!ptr || avpkt->size < 2)
    return AVERROR_INVALIDDATA;

  /*
   * A packet of size two with value zero is an empty subtitle
   * used to mark the end of the previous non-empty subtitle.
   * We can just drop them here as we have duration information
   * already. If the value is non-zero, then it's technically a
   * bad packet.
   */
  if (avpkt->size == 2)
    return AV_RB16(ptr) == 0 ? 0 : AVERROR_INVALIDDATA;

  /*
   * The first two bytes of the packet are the length of the text string
   * In complex cases, there are style descriptors appended to the string
   * so we can't just assume the packet size is the string size.
   */
  end = ptr + FFMIN(2 + AV_RB16(ptr), avpkt->size);
  ptr += 2;

  ts_start = av_rescale_q(avpkt->pts,
                          avctx->time_base,
                          (AVRational){1,100});
  ts_end   = av_rescale_q(avpkt->pts + avpkt->duration,
                          avctx->time_base,
                          (AVRational){1,100});

  // Note that the spec recommends lines be no longer than 2048 characters.
  av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
  text_to_ass(&buf, ptr, end);

  if (!av_bprint_is_complete(&buf))
    return AVERROR(ENOMEM);

  ff_ass_add_rect(sub, buf.str, ts_start, ts_end-ts_start, 0);
  *got_sub_ptr = sub->num_rects > 0;
  av_bprint_finalize(&buf, NULL);
  return avpkt->size;
}
示例#3
0
文件: movtextdec.c 项目: kak2/FFmpeg
static int mov_text_decode_frame(AVCodecContext *avctx,
                            void *data, int *got_sub_ptr, AVPacket *avpkt)
{
    AVSubtitle *sub = data;
    MovTextContext *m = avctx->priv_data;
    int ret, ts_start, ts_end;
    AVBPrint buf;
    char *ptr = avpkt->data;
    char *end;
    int text_length, tsmb_type, ret_tsmb;
    uint64_t tsmb_size;
    const uint8_t *tsmb;

    if (!ptr || avpkt->size < 2)
        return AVERROR_INVALIDDATA;

    /*
     * A packet of size two with value zero is an empty subtitle
     * used to mark the end of the previous non-empty subtitle.
     * We can just drop them here as we have duration information
     * already. If the value is non-zero, then it's technically a
     * bad packet.
     */
    if (avpkt->size == 2)
        return AV_RB16(ptr) == 0 ? 0 : AVERROR_INVALIDDATA;

    /*
     * The first two bytes of the packet are the length of the text string
     * In complex cases, there are style descriptors appended to the string
     * so we can't just assume the packet size is the string size.
     */
    text_length = AV_RB16(ptr);
    end = ptr + FFMIN(2 + text_length, avpkt->size);
    ptr += 2;

    ts_start = av_rescale_q(avpkt->pts,
                            avctx->time_base,
                            (AVRational){1,100});
    ts_end   = av_rescale_q(avpkt->pts + avpkt->duration,
                            avctx->time_base,
                            (AVRational){1,100});

    tsmb_size = 0;
    m->tracksize = 2 + text_length;
    m->style_entries = 0;
    m->box_flags = 0;
    m->count_s = 0;
    // Note that the spec recommends lines be no longer than 2048 characters.
    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
    if (text_length + 2 != avpkt->size) {
        while (m->tracksize + 8 <= avpkt->size) {
            // A box is a minimum of 8 bytes.
            tsmb = ptr + m->tracksize - 2;
            tsmb_size = AV_RB32(tsmb);
            tsmb += 4;
            tsmb_type = AV_RB32(tsmb);
            tsmb += 4;

            if (tsmb_size == 1) {
                if (m->tracksize + 16 > avpkt->size)
                    break;
                tsmb_size = AV_RB64(tsmb);
                tsmb += 8;
                m->size_var = 16;
            } else
                m->size_var = 8;
            //size_var is equal to 8 or 16 depending on the size of box

            if (m->tracksize + tsmb_size > avpkt->size)
                break;

            for (size_t i = 0; i < box_count; i++) {
                if (tsmb_type == box_types[i].type) {
                    if (m->tracksize + m->size_var + box_types[i].base_size > avpkt->size)
                        break;
                    ret_tsmb = box_types[i].decode(tsmb, m, avpkt);
                    if (ret_tsmb == -1)
                        break;
                }
            }
            m->tracksize = m->tracksize + tsmb_size;
        }
        text_to_ass(&buf, ptr, end, m);
        mov_text_cleanup(m);
    } else
        text_to_ass(&buf, ptr, end, m);

    ret = ff_ass_add_rect_bprint(sub, &buf, ts_start, ts_end - ts_start);
    av_bprint_finalize(&buf, NULL);
    if (ret < 0)
        return ret;
    *got_sub_ptr = sub->num_rects > 0;
    return avpkt->size;
}
示例#4
0
static int mov_text_decode_frame(AVCodecContext *avctx,
                            void *data, int *got_sub_ptr, AVPacket *avpkt)
{
    AVSubtitle *sub = data;
    int ret, ts_start, ts_end;
    AVBPrint buf;
    char *ptr = avpkt->data;
    char *end;
    //char *ptr_temp;
    int text_length, tsmb_type, style_entries;
    uint64_t tsmb_size, tracksize;
    StyleBox **s = {0, };
    StyleBox *s_temp;
    const uint8_t *tsmb;
    int count, i, size_var;

    if (!ptr || avpkt->size < 2)
        return AVERROR_INVALIDDATA;

    /*
     * A packet of size two with value zero is an empty subtitle
     * used to mark the end of the previous non-empty subtitle.
     * We can just drop them here as we have duration information
     * already. If the value is non-zero, then it's technically a
     * bad packet.
     */
    if (avpkt->size == 2)
        return AV_RB16(ptr) == 0 ? 0 : AVERROR_INVALIDDATA;

    /*
     * The first two bytes of the packet are the length of the text string
     * In complex cases, there are style descriptors appended to the string
     * so we can't just assume the packet size is the string size.
     */
    text_length = AV_RB16(ptr);
    end = ptr + FFMIN(2 + text_length, avpkt->size);
    ptr += 2;

    ts_start = av_rescale_q(avpkt->pts,
                            avctx->time_base,
                            (AVRational){1,100});
    ts_end   = av_rescale_q(avpkt->pts + avpkt->duration,
                            avctx->time_base,
                            (AVRational){1,100});

    tsmb_size = 0;
    tracksize = 2 + text_length;
    // Note that the spec recommends lines be no longer than 2048 characters.
    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
    if (text_length + 2 != avpkt->size) {
        while (tracksize + 8 <= avpkt->size) {
            // A box is a minimum of 8 bytes.
            tsmb = ptr + tracksize - 2;
            tsmb_size = AV_RB32(tsmb);
            tsmb += 4;
            tsmb_type = AV_RB32(tsmb);
            tsmb += 4;

            if (tsmb_size == 1) {
                if (tracksize + 16 > avpkt->size)
                    break;
                tsmb_size = AV_RB64(tsmb);
                tsmb += 8;
                size_var = 18;
            } else
                size_var = 10;
            //size_var is equal to 10 or 18 depending on the size of box

            if (tracksize + tsmb_size > avpkt->size)
                break;

            if (tsmb_type == MKBETAG('s','t','y','l')) {
                if (tracksize + size_var > avpkt->size)
                    break;
                style_entries = AV_RB16(tsmb);
                tsmb += 2;

                // A single style record is of length 12 bytes.
                if (tracksize + size_var + style_entries * 12 > avpkt->size)
                    break;
                count = 0;

                for(i = 0; i < style_entries; i++) {
                    s_temp = av_malloc(sizeof(*s_temp));
                    if (!s_temp)
                        goto error;

                    s_temp->style_start = AV_RB16(tsmb);
                    tsmb += 2;
                    s_temp->style_end = AV_RB16(tsmb);
                    tsmb += 2;
                    // fontID = AV_RB16(tsmb);
                    tsmb += 2;
                    s_temp->style_flag = AV_RB8(tsmb);
                    av_dynarray_add(&s, &count, s_temp);
                    if(!s)
                        goto error;
                    //fontsize=AV_RB8(tsmb);
                    tsmb += 2;
                    // text-color-rgba
                    tsmb += 4;
                }
                text_to_ass(&buf, ptr, end, s, style_entries);

                for(i = 0; i < count; i++) {
                    av_freep(&s[i]);
                }
                av_freep(&s);
            }
            tracksize = tracksize + tsmb_size;
        }
    } else
        text_to_ass(&buf, ptr, end, NULL, 0);

    ret = ff_ass_add_rect_bprint(sub, &buf, ts_start, ts_end - ts_start);
    av_bprint_finalize(&buf, NULL);
    if (ret < 0)
        return ret;
    *got_sub_ptr = sub->num_rects > 0;
    return avpkt->size;

error:
    for(i = 0; i < count; i++) {
        av_freep(&s[i]);
    }
    av_freep(&s);
    if (s_temp)
        av_freep(&s_temp);
    av_bprint_finalize(&buf, NULL);
    return AVERROR(ENOMEM);
}