OSDN Git Service

Merge commit '5c9c305d14730faf2af206e5d519df4948de0ed2'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 2 Mar 2014 20:44:44 +0000 (21:44 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 2 Mar 2014 20:44:44 +0000 (21:44 +0100)
* commit '5c9c305d14730faf2af206e5d519df4948de0ed2':
  ass: K&R formatting cosmetics

Conflicts:
libavformat/assdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/assdec.c

  
  #include <stdint.h>
  
 -#include "libavutil/mathematics.h"
 -
  #include "avformat.h"
  #include "internal.h"
 -
 -#define MAX_LINESIZE 2000
 +#include "subtitles.h"
 +#include "libavcodec/internal.h"
 +#include "libavutil/bprint.h"
  
- typedef struct ASSContext{
+ typedef struct ASSContext {
 -    uint8_t *event_buffer;
 -    uint8_t **event;
 -    unsigned int event_count;
 -    unsigned int event_index;
 +    FFDemuxSubtitlesQueue q;
- }ASSContext;
+ } ASSContext;
  
 -static int probe(AVProbeData *p)
 +static int ass_probe(AVProbeData *p)
  {
-     const char *header= "[Script Info]";
+     const char *header = "[Script Info]";
  
-     if(   !memcmp(p->buf  , header, strlen(header))
-        || !memcmp(p->buf+3, header, strlen(header)))
+     if (!memcmp(p->buf, header, strlen(header)) ||
+         !memcmp(p->buf + 3, header, strlen(header)))
          return AVPROBE_SCORE_MAX;
  
      return 0;
@@@ -91,72 -86,127 +91,72 @@@ static int ass_read_header(AVFormatCont
  
      st = avformat_new_stream(s, NULL);
      if (!st)
 -        return -1;
 +        return AVERROR(ENOMEM);
      avpriv_set_pts_info(st, 64, 1, 100);
      st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
-     st->codec->codec_id= AV_CODEC_ID_SSA;
+     st->codec->codec_id   = AV_CODEC_ID_SSA;
  
-     header_remaining= INT_MAX;
+     header_remaining = INT_MAX;
 -    dst[0] = &st->codec->extradata;
 -    dst[1] = &ass->event_buffer;
 -    while (!pb->eof_reached) {
 -        uint8_t line[MAX_LINESIZE];
  
 -        len = ff_get_line(pb, line, sizeof(line));
 +    av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
 +    av_bprint_init(&line,   0, AV_BPRINT_SIZE_UNLIMITED);
  
 -        if (!memcmp(line, "[Events]", 8))
 -            header_remaining = 2;
 -        else if (line[0] == '[')
 -            header_remaining = INT_MAX;
 +    for (;;) {
 +        int64_t pos = get_line(&line, s->pb);
  
 -        i = header_remaining == 0;
 +        if (!line.str[0]) // EOF
 +            break;
  
 -        if (i && get_pts(line) == AV_NOPTS_VALUE)
 -            continue;
 +        if (!memcmp(line.str, "[Events]", 8))
-             header_remaining= 2;
-         else if (line.str[0]=='[')
-             header_remaining= INT_MAX;
++            header_remaining = 2;
++        else if (line.str[0] == '[')
++            header_remaining = INT_MAX;
  
 -        p = av_fast_realloc(*(dst[i]), &allocated[i], pos[i] + MAX_LINESIZE);
 -        if (!p)
 -            goto fail;
 -        *(dst[i]) = p;
 -        memcpy(p + pos[i], line, len + 1);
 -        pos[i] += len;
 -        if (i)
 -            ass->event_count++;
 -        else
 +        if (header_remaining) {
 +            av_bprintf(&header, "%s", line.str);
              header_remaining--;
 -    }
 -    st->codec->extradata_size = pos[0];
 -
 -    if (ass->event_count >= UINT_MAX / sizeof(*ass->event))
 -        goto fail;
 -
 -    ass->event = av_malloc(ass->event_count * sizeof(*ass->event));
 -    p = ass->event_buffer;
 -    for (i = 0; i < ass->event_count; i++) {
 -        ass->event[i] = p;
 -        while (*p && *p != '\n')
 -            p++;
 -        p++;
 +        } else {
 +            int64_t ts_start = AV_NOPTS_VALUE;
 +            int duration = -1;
 +            AVPacket *sub;
 +
 +            if (read_ts(line.str, &ts_start, &duration) < 0)
 +                continue;
 +            sub = ff_subtitles_queue_insert(&ass->q, line.str, line.len, 0);
 +            if (!sub) {
 +                res = AVERROR(ENOMEM);
 +                goto end;
 +            }
 +            sub->pos = pos;
 +            sub->pts = ts_start;
 +            sub->duration = duration;
 +        }
      }
  
 -    qsort(ass->event, ass->event_count, sizeof(*ass->event), event_cmp);
 +    av_bprint_finalize(&line, NULL);
  
 -    return 0;
 +    res = avpriv_bprint_to_extradata(st->codec, &header);
 +    if (res < 0)
 +        goto end;
  
 -fail:
 -    read_close(s);
 +    ff_subtitles_queue_finalize(&ass->q);
  
 -    return -1;
 +end:
 +    return res;
  }
  
 -static int read_packet(AVFormatContext *s, AVPacket *pkt)
 +static int ass_read_packet(AVFormatContext *s, AVPacket *pkt)
  {
      ASSContext *ass = s->priv_data;
 -    uint8_t *p, *end;
 -
 -    if (ass->event_index >= ass->event_count)
 -        return AVERROR(EIO);
 -
 -    p = ass->event[ass->event_index];
 -
 -    end = strchr(p, '\n');
 -    av_new_packet(pkt, end ? end - p + 1 : strlen(p));
 -    pkt->flags |= AV_PKT_FLAG_KEY;
 -    pkt->pos    = p - ass->event_buffer + s->streams[0]->codec->extradata_size;
 -    pkt->pts    = pkt->dts = get_pts(p);
 -    memcpy(pkt->data, p, pkt->size);
 -
 -    ass->event_index++;
 -
 -    return 0;
 +    return ff_subtitles_queue_read_packet(&ass->q, pkt);
  }
  
 -static int read_seek2(AVFormatContext *s, int stream_index,
 -                      int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
 +static int ass_read_seek(AVFormatContext *s, int stream_index,
 +                         int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
  {
      ASSContext *ass = s->priv_data;
 -
 -    if (flags & AVSEEK_FLAG_BYTE) {
 -        return AVERROR(ENOSYS);
 -    } else if (flags & AVSEEK_FLAG_FRAME) {
 -        if (ts < 0 || ts >= ass->event_count)
 -            return AVERROR(ERANGE);
 -        ass->event_index = ts;
 -    } else {
 -        int i, idx = -1;
 -        int64_t min_ts_diff = INT64_MAX;
 -        if (stream_index == -1) {
 -            AVRational time_base = s->streams[0]->time_base;
 -            ts     = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
 -            min_ts = av_rescale_rnd(min_ts, time_base.den,
 -                                    time_base.num * (int64_t) AV_TIME_BASE,
 -                                    AV_ROUND_UP);
 -            max_ts = av_rescale_rnd(max_ts, time_base.den,
 -                                    time_base.num * (int64_t) AV_TIME_BASE,
 -                                    AV_ROUND_DOWN);
 -        }
 -        /* TODO: ass->event[] is sorted by pts so we could do a binary search */
 -        for (i = 0; i < ass->event_count; i++) {
 -            int64_t pts     = get_pts(ass->event[i]);
 -            int64_t ts_diff = FFABS(pts - ts);
 -            if (pts >= min_ts && pts <= max_ts && ts_diff < min_ts_diff) {
 -                min_ts_diff = ts_diff;
 -                idx         = i;
 -            }
 -        }
 -        if (idx < 0)
 -            return AVERROR(ERANGE);
 -        ass->event_index = idx;
 -    }
 -    return 0;
 +    return ff_subtitles_queue_seek(&ass->q, s, stream_index,
 +                                   min_ts, ts, max_ts, flags);
  }
  
  AVInputFormat ff_ass_demuxer = {