Merge commit 'b7e64fba7f37cc0399beae844f0a5dbef9219376'
authorClément Bœsch <u@pkh.me>
Tue, 21 Jun 2016 20:40:56 +0000 (22:40 +0200)
committerClément Bœsch <u@pkh.me>
Tue, 21 Jun 2016 20:40:56 +0000 (22:40 +0200)
* commit 'b7e64fba7f37cc0399beae844f0a5dbef9219376':
  Reduce the scope of some variables

Merged-by: Clément Bœsch <u@pkh.me>
1  2 
libavcodec/dvbsubdec.c
libavcodec/mpegvideo_enc.c
libavcodec/pgssubdec.c
libavcodec/xsubdec.c
libavdevice/v4l2.c

@@@ -761,196 -717,7 +761,199 @@@ static int dvbsub_read_8bit_string(AVCo
      return pixels_read;
  }
  
-     int i,j;
 +static void compute_default_clut(AVSubtitleRect *rect, int w, int h)
 +{
 +    uint8_t list[256] = {0};
 +    uint8_t list_inv[256];
 +    int counttab[256] = {0};
 +    int count, i, x, y;
 +
 +#define V(x,y) rect->data[0][(x) + (y)*rect->linesize[0]]
 +    for (y = 0; y<h; y++) {
 +        for (x = 0; x<w; x++) {
 +            int v = V(x,y) + 1;
 +            int vl = x     ? V(x-1,y) + 1 : 0;
 +            int vr = x+1<w ? V(x+1,y) + 1 : 0;
 +            int vt = y     ? V(x,y-1) + 1 : 0;
 +            int vb = y+1<h ? V(x,y+1) + 1 : 0;
 +            counttab[v-1] += !!((v!=vl) + (v!=vr) + (v!=vt) + (v!=vb));
 +        }
 +    }
 +#define L(x,y) list[ rect->data[0][(x) + (y)*rect->linesize[0]] ]
 +
 +    for (i = 0; i<256; i++) {
 +        int scoretab[256] = {0};
 +        int bestscore = 0;
 +        int bestv = 0;
 +        for (y = 0; y<h; y++) {
 +            for (x = 0; x<w; x++) {
 +                int v = rect->data[0][x + y*rect->linesize[0]];
 +                int l_m = list[v];
 +                int l_l = x     ? L(x-1, y) : 1;
 +                int l_r = x+1<w ? L(x+1, y) : 1;
 +                int l_t = y     ? L(x, y-1) : 1;
 +                int l_b = y+1<h ? L(x, y+1) : 1;
 +                int score;
 +                if (l_m)
 +                    continue;
 +                scoretab[v] += l_l + l_r + l_t + l_b;
 +                score = 1024LL*scoretab[v] / counttab[v];
 +                if (score > bestscore) {
 +                    bestscore = score;
 +                    bestv = v;
 +                }
 +            }
 +        }
 +        if (!bestscore)
 +            break;
 +        list    [ bestv ] = 1;
 +        list_inv[     i ] = bestv;
 +    }
 +
 +    count = i - 1;
 +    for (i--; i>=0; i--) {
 +        int v = i*255/count;
 +        AV_WN32(rect->data[1] + 4*list_inv[i], RGBA(v/2,v,v/2,v));
 +    }
 +}
 +
 +
 +static int save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_output)
 +{
 +    DVBSubContext *ctx = avctx->priv_data;
 +    DVBSubRegionDisplay *display;
 +    DVBSubDisplayDefinition *display_def = ctx->display_definition;
 +    DVBSubRegion *region;
 +    AVSubtitleRect *rect;
 +    DVBSubCLUT *clut;
 +    uint32_t *clut_table;
++    int i;
 +    int offset_x=0, offset_y=0;
 +    int ret = 0;
 +
 +
 +    if (display_def) {
 +        offset_x = display_def->x;
 +        offset_y = display_def->y;
 +    }
 +
 +    /* Not touching AVSubtitles again*/
 +    if(sub->num_rects) {
 +        avpriv_request_sample(ctx, "Different Version of Segment asked Twice");
 +        return AVERROR_PATCHWELCOME;
 +    }
 +    for (display = ctx->display_list; display; display = display->next) {
 +        region = get_region(ctx, display->region_id);
 +        if (region && region->dirty)
 +            sub->num_rects++;
 +    }
 +
 +    if(ctx->compute_edt == 0) {
 +        sub->end_display_time = ctx->time_out * 1000;
 +        *got_output = 1;
 +    } else if (ctx->prev_start != AV_NOPTS_VALUE) {
 +        sub->end_display_time = av_rescale_q((sub->pts - ctx->prev_start ), AV_TIME_BASE_Q, (AVRational){ 1, 1000 }) - 1;
 +        *got_output = 1;
 +    }
 +    if (sub->num_rects > 0) {
 +
 +        sub->rects = av_mallocz_array(sizeof(*sub->rects), sub->num_rects);
 +        if (!sub->rects) {
 +            ret = AVERROR(ENOMEM);
 +            goto fail;
 +        }
 +
 +        for(i=0; i<sub->num_rects; i++)
 +            sub->rects[i] = av_mallocz(sizeof(*sub->rects[i]));
 +
 +        i = 0;
 +
 +        for (display = ctx->display_list; display; display = display->next) {
 +            region = get_region(ctx, display->region_id);
 +
 +            if (!region)
 +                continue;
 +
 +            if (!region->dirty)
 +                continue;
 +
 +            rect = sub->rects[i];
 +            rect->x = display->x_pos + offset_x;
 +            rect->y = display->y_pos + offset_y;
 +            rect->w = region->width;
 +            rect->h = region->height;
 +            rect->nb_colors = (1 << region->depth);
 +            rect->type      = SUBTITLE_BITMAP;
 +            rect->linesize[0] = region->width;
 +
 +            clut = get_clut(ctx, region->clut);
 +
 +            if (!clut)
 +                clut = &default_clut;
 +
 +            switch (region->depth) {
 +            case 2:
 +                clut_table = clut->clut4;
 +                break;
 +            case 8:
 +                clut_table = clut->clut256;
 +                break;
 +            case 4:
 +            default:
 +                clut_table = clut->clut16;
 +                break;
 +            }
 +
 +            rect->data[1] = av_mallocz(AVPALETTE_SIZE);
 +            if (!rect->data[1]) {
 +                ret = AVERROR(ENOMEM);
 +                goto fail;
 +            }
 +            memcpy(rect->data[1], clut_table, (1 << region->depth) * sizeof(uint32_t));
 +
 +            rect->data[0] = av_malloc(region->buf_size);
 +            if (!rect->data[0]) {
 +                ret = AVERROR(ENOMEM);
 +                goto fail;
 +            }
 +
 +            memcpy(rect->data[0], region->pbuf, region->buf_size);
 +
 +            if ((clut == &default_clut && ctx->compute_clut == -1) || ctx->compute_clut == 1)
 +                compute_default_clut(rect, rect->w, rect->h);
 +
 +#if FF_API_AVPICTURE
 +FF_DISABLE_DEPRECATION_WARNINGS
++{
++            int j;
 +            for (j = 0; j < 4; j++) {
 +                rect->pict.data[j] = rect->data[j];
 +                rect->pict.linesize[j] = rect->linesize[j];
 +            }
++}
 +FF_ENABLE_DEPRECATION_WARNINGS
 +#endif
 +
 +            i++;
 +        }
 +    }
  
 +    return 0;
 +fail:
 +    if (sub->rects) {
 +        for(i=0; i<sub->num_rects; i++) {
 +            rect = sub->rects[i];
 +            if (rect) {
 +                av_freep(&rect->data[0]);
 +                av_freep(&rect->data[1]);
 +            }
 +            av_freep(&sub->rects[i]);
 +        }
 +        av_freep(&sub->rects);
 +    }
 +    sub->num_rects = 0;
 +    return ret;
 +}
  
  static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display,
                                            const uint8_t *buf, int buf_size, int top_bottom, int non_mod)
@@@ -2895,43 -2681,9 +2895,43 @@@ static void update_mb_info(MpegEncConte
      write_mb_info(s);
  }
  
 +int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase)
 +{
 +    if (   s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold
 +        && s->slice_context_count == 1
 +        && s->pb.buf == s->avctx->internal->byte_buffer) {
 +        int lastgob_pos = s->ptr_lastgob - s->pb.buf;
 +        int vbv_pos     = s->vbv_delay_ptr - s->pb.buf;
 +
 +        uint8_t *new_buffer = NULL;
 +        int new_buffer_size = 0;
 +
 +        if ((s->avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
 +            av_log(s->avctx, AV_LOG_ERROR, "Cannot reallocate putbit buffer\n");
 +            return AVERROR(ENOMEM);
 +        }
 +
 +        av_fast_padded_malloc(&new_buffer, &new_buffer_size,
 +                              s->avctx->internal->byte_buffer_size + size_increase);
 +        if (!new_buffer)
 +            return AVERROR(ENOMEM);
 +
 +        memcpy(new_buffer, s->avctx->internal->byte_buffer, s->avctx->internal->byte_buffer_size);
 +        av_free(s->avctx->internal->byte_buffer);
 +        s->avctx->internal->byte_buffer      = new_buffer;
 +        s->avctx->internal->byte_buffer_size = new_buffer_size;
 +        rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
 +        s->ptr_lastgob   = s->pb.buf + lastgob_pos;
 +        s->vbv_delay_ptr = s->pb.buf + vbv_pos;
 +    }
 +    if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold)
 +        return AVERROR(EINVAL);
 +    return 0;
 +}
 +
  static int encode_thread(AVCodecContext *c, void *arg){
      MpegEncContext *s= *(void**)arg;
-     int mb_x, mb_y, pdif = 0;
+     int mb_x, mb_y;
      int chr_h= 16>>s->chroma_y_shift;
      int i, j;
      MpegEncContext best_s = { 0 }, backup_s;
@@@ -592,18 -576,22 +590,22 @@@ static int display_end_segment(AVCodecC
              return AVERROR(ENOMEM);
          }
  
 +        if (!ctx->forced_subs_only || ctx->presentation.objects[i].composition_flag & 0x40)
 +        memcpy(sub->rects[i]->data[1], palette->clut, sub->rects[i]->nb_colors * sizeof(uint32_t));
 +
  #if FF_API_AVPICTURE
  FF_DISABLE_DEPRECATION_WARNINGS
+ {
+         AVSubtitleRect *rect;
+         int j;
          rect = sub->rects[i];
          for (j = 0; j < 4; j++) {
              rect->pict.data[j] = rect->data[j];
              rect->pict.linesize[j] = rect->linesize[j];
          }
+ }
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
 -
 -        memcpy(sub->rects[i]->data[1], palette->clut, sub->rects[i]->nb_colors * sizeof(uint32_t));
 -
      }
      return 1;
  }
@@@ -57,12 -57,12 +57,10 @@@ static int decode_frame(AVCodecContext 
      int64_t packet_time = 0;
      GetBitContext gb;
      int has_alpha = avctx->codec_tag == MKTAG('D','X','S','A');
-     AVSubtitleRect *rect;
-     int j;
  
 -    memset(sub, 0, sizeof(*sub));
 -
      // check that at least header fits
      if (buf_size < 27 + 7 * 2 + 4 * (3 + has_alpha)) {
 -        av_log(avctx, AV_LOG_ERROR, "coded frame too small\n");
 +        av_log(avctx, AV_LOG_ERROR, "coded frame size %d too small\n", buf_size);
          return -1;
      }
  
@@@ -950,31 -844,19 +950,31 @@@ static int v4l2_read_header(AVFormatCon
      if (codec_id == AV_CODEC_ID_RAWVIDEO)
          st->codecpar->codec_tag =
              avcodec_pix_fmt_to_codec_tag(st->codecpar->format);
 +    else if (codec_id == AV_CODEC_ID_H264) {
 +        st->need_parsing = AVSTREAM_PARSE_FULL_ONCE;
 +    }
 +    if (desired_format == V4L2_PIX_FMT_YVU420)
 +        st->codecpar->codec_tag = MKTAG('Y', 'V', '1', '2');
 +    else if (desired_format == V4L2_PIX_FMT_YVU410)
 +        st->codecpar->codec_tag = MKTAG('Y', 'V', 'U', '9');
      st->codecpar->width = s->width;
      st->codecpar->height = s->height;
 -    st->codecpar->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
 +    if (st->avg_frame_rate.den)
 +        st->codecpar->bit_rate = s->frame_size * av_q2d(st->avg_frame_rate) * 8;
  
      return 0;
 +
 +fail:
 +    v4l2_close(s->fd);
 +    return res;
  }
  
 -static int v4l2_read_packet(AVFormatContext *s1, AVPacket *pkt)
 +static int v4l2_read_packet(AVFormatContext *ctx, AVPacket *pkt)
  {
-     struct video_data *s = ctx->priv_data;
  #if FF_API_CODED_FRAME
  FF_DISABLE_DEPRECATION_WARNINGS
 -    struct video_data *s = s1->priv_data;
 -    AVFrame *frame = s1->streams[0]->codec->coded_frame;
++    struct video_data *s = ctx->priv_data;
 +    AVFrame *frame = ctx->streams[0]->codec->coded_frame;
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
      int res;