~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavfilter/vf_yadif.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2012-01-12 22:23:28 UTC
  • mfrom: (0.4.7 sid)
  • mto: This revision was merged to the branch mainline in revision 76.
  • Revision ID: package-import@ubuntu.com-20120112222328-8jqdyodym3p84ygu
Tags: 2:1.0~rc4.dfsg1+svn34540-1
* New upstream snapshot
* upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
    int mode;
39
39
 
40
40
    /**
41
 
     *  0: bottom field first
42
 
     *  1: top field first
 
41
     *  0: top field first
 
42
     *  1: bottom field first
43
43
     * -1: auto-detection
44
44
     */
45
45
    int parity;
46
46
 
47
47
    int frame_pending;
48
48
 
 
49
    /**
 
50
     *  0: deinterlace all frames
 
51
     *  1: only deinterlace frames marked as interlaced
 
52
     */
 
53
    int auto_enable;
 
54
 
49
55
    AVFilterBufferRef *cur;
50
56
    AVFilterBufferRef *next;
51
57
    AVFilterBufferRef *prev;
139
145
        int w = dstpic->video->w;
140
146
        int h = dstpic->video->h;
141
147
        int refs = yadif->cur->linesize[i];
142
 
        int df = (yadif->csp->comp[i].depth_minus1+1) / 8;
 
148
        int df = (yadif->csp->comp[i].depth_minus1 + 8) / 8;
143
149
 
144
 
        if (i) {
 
150
        if (i == 1 || i == 2) {
145
151
        /* Why is this not part of the per-plane description thing? */
146
152
            w >>= yadif->csp->log2_chroma_w;
147
153
            h >>= yadif->csp->log2_chroma_h;
197
203
        tff = yadif->parity^1;
198
204
    }
199
205
 
200
 
    if (is_second)
 
206
    if (is_second) {
201
207
        yadif->out = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
202
208
                                               AV_PERM_REUSE, link->w, link->h);
 
209
        avfilter_copy_buffer_ref_props(yadif->out, yadif->cur);
 
210
        yadif->out->video->interlaced = 0;
 
211
    }
203
212
 
204
213
    if (!yadif->csp)
205
214
        yadif->csp = &av_pix_fmt_descriptors[link->format];
206
 
    if (yadif->csp->comp[0].depth_minus1 == 15)
 
215
    if (yadif->csp->comp[0].depth_minus1 / 8 == 1)
207
216
        yadif->filter_line = filter_line_c_16bit;
208
217
 
209
218
    filter(ctx, yadif->out, tff ^ !is_second, tff);
242
251
    if (!yadif->cur)
243
252
        return;
244
253
 
 
254
    if (yadif->auto_enable && !yadif->cur->video->interlaced) {
 
255
        yadif->out  = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
 
256
        avfilter_unref_buffer(yadif->prev);
 
257
        yadif->prev = NULL;
 
258
        avfilter_start_frame(ctx->outputs[0], yadif->out);
 
259
        return;
 
260
    }
 
261
 
245
262
    if (!yadif->prev)
246
263
        yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
247
264
 
261
278
    if (!yadif->out)
262
279
        return;
263
280
 
 
281
    if (yadif->auto_enable && !yadif->cur->video->interlaced) {
 
282
        avfilter_draw_slice(ctx->outputs[0], 0, link->h, 1);
 
283
        avfilter_end_frame(ctx->outputs[0]);
 
284
        return;
 
285
    }
 
286
 
264
287
    return_frame(ctx, 0);
265
288
}
266
289
 
301
324
    }
302
325
    assert(yadif->next || !val);
303
326
 
 
327
    if (yadif->auto_enable && yadif->next && !yadif->next->video->interlaced)
 
328
        return val;
 
329
 
304
330
    return val * ((yadif->mode&1)+1);
305
331
}
306
332
 
328
354
        AV_NE( PIX_FMT_GRAY16BE, PIX_FMT_GRAY16LE ),
329
355
        PIX_FMT_YUV440P,
330
356
        PIX_FMT_YUVJ440P,
 
357
        AV_NE( PIX_FMT_YUV420P10BE, PIX_FMT_YUV420P10LE ),
 
358
        AV_NE( PIX_FMT_YUV422P10BE, PIX_FMT_YUV422P10LE ),
 
359
        AV_NE( PIX_FMT_YUV444P10BE, PIX_FMT_YUV444P10LE ),
331
360
        AV_NE( PIX_FMT_YUV420P16BE, PIX_FMT_YUV420P16LE ),
332
361
        AV_NE( PIX_FMT_YUV422P16BE, PIX_FMT_YUV422P16LE ),
333
362
        AV_NE( PIX_FMT_YUV444P16BE, PIX_FMT_YUV444P16LE ),
 
363
        PIX_FMT_YUVA420P,
334
364
        PIX_FMT_NONE
335
365
    };
336
366
 
346
376
 
347
377
    yadif->mode = 0;
348
378
    yadif->parity = -1;
 
379
    yadif->auto_enable = 0;
349
380
    yadif->csp = NULL;
350
381
 
351
 
    if (args) sscanf(args, "%d:%d", &yadif->mode, &yadif->parity);
 
382
    if (args) sscanf(args, "%d:%d:%d", &yadif->mode, &yadif->parity, &yadif->auto_enable);
352
383
 
353
384
    yadif->filter_line = filter_line_c;
354
385
    if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3)
358
389
    else if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX)
359
390
        yadif->filter_line = ff_yadif_filter_line_mmx;
360
391
 
361
 
    av_log(ctx, AV_LOG_INFO, "mode:%d parity:%d\n", yadif->mode, yadif->parity);
 
392
    av_log(ctx, AV_LOG_INFO, "mode:%d parity:%d auto_enable:%d\n", yadif->mode, yadif->parity, yadif->auto_enable);
362
393
 
363
394
    return 0;
364
395
}