Lines 446-449
Link Here
|
446 |
# define FFMPEG_HAVE_DEPRECATED_FLAGS2 |
446 |
# define FFMPEG_HAVE_DEPRECATED_FLAGS2 |
447 |
#endif |
447 |
#endif |
448 |
|
448 |
|
|
|
449 |
/* Since FFmpeg-1.1 this constant have AV_ prefix. */ |
450 |
#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(52, 13, 100) |
451 |
# define AV_PIX_FMT_BGR32 PIX_FMT_BGR32 |
452 |
# define AV_PIX_FMT_YUV422P PIX_FMT_YUV422P |
453 |
# define AV_PIX_FMT_BGRA PIX_FMT_BGRA |
454 |
# define AV_PIX_FMT_ARGB PIX_FMT_ARGB |
455 |
# define AV_PIX_FMT_RGBA PIX_FMT_RGBA |
456 |
#endif |
457 |
|
458 |
/* New API from FFmpeg-2.0 which soon became recommended one. */ |
459 |
#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(52, 38, 100) |
460 |
# define av_frame_alloc avcodec_alloc_frame |
461 |
# define av_frame_free avcodec_free_frame |
462 |
# define av_frame_unref avcodec_get_frame_defaults |
463 |
#endif |
464 |
|
465 |
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 24, 102) |
466 |
|
467 |
/* NOTE: The code in this block are from FFmpeg 2.6.4, which is licensed by LGPL. */ |
468 |
|
469 |
#define MAX_NEG_CROP 1024 |
470 |
|
471 |
#define times4(x) x, x, x, x |
472 |
#define times256(x) times4(times4(times4(times4(times4(x))))) |
473 |
|
474 |
static const uint8_t ff_compat_crop_tab[256 + 2 * MAX_NEG_CROP] = { |
475 |
times256(0x00), |
476 |
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
477 |
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, |
478 |
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, |
479 |
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
480 |
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, |
481 |
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, |
482 |
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, |
483 |
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, |
484 |
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, |
485 |
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, |
486 |
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, |
487 |
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, |
488 |
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, |
489 |
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, |
490 |
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, |
491 |
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, |
492 |
times256(0xFF) |
493 |
}; |
494 |
|
495 |
#undef times4 |
496 |
#undef times256 |
497 |
|
498 |
/* filter parameters: [-1 4 2 4 -1] // 8 */ |
499 |
FFMPEG_INLINE |
500 |
void deinterlace_line(uint8_t *dst, |
501 |
const uint8_t *lum_m4, const uint8_t *lum_m3, |
502 |
const uint8_t *lum_m2, const uint8_t *lum_m1, |
503 |
const uint8_t *lum, |
504 |
int size) |
505 |
{ |
506 |
const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP; |
507 |
int sum; |
508 |
|
509 |
for(;size > 0;size--) { |
510 |
sum = -lum_m4[0]; |
511 |
sum += lum_m3[0] << 2; |
512 |
sum += lum_m2[0] << 1; |
513 |
sum += lum_m1[0] << 2; |
514 |
sum += -lum[0]; |
515 |
dst[0] = cm[(sum + 4) >> 3]; |
516 |
lum_m4++; |
517 |
lum_m3++; |
518 |
lum_m2++; |
519 |
lum_m1++; |
520 |
lum++; |
521 |
dst++; |
522 |
} |
523 |
} |
524 |
|
525 |
FFMPEG_INLINE |
526 |
void deinterlace_line_inplace(uint8_t *lum_m4, uint8_t *lum_m3, |
527 |
uint8_t *lum_m2, uint8_t *lum_m1, |
528 |
uint8_t *lum, int size) |
529 |
{ |
530 |
const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP; |
531 |
int sum; |
532 |
|
533 |
for(;size > 0;size--) { |
534 |
sum = -lum_m4[0]; |
535 |
sum += lum_m3[0] << 2; |
536 |
sum += lum_m2[0] << 1; |
537 |
lum_m4[0]=lum_m2[0]; |
538 |
sum += lum_m1[0] << 2; |
539 |
sum += -lum[0]; |
540 |
lum_m2[0] = cm[(sum + 4) >> 3]; |
541 |
lum_m4++; |
542 |
lum_m3++; |
543 |
lum_m2++; |
544 |
lum_m1++; |
545 |
lum++; |
546 |
} |
547 |
} |
548 |
|
549 |
/* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The |
550 |
top field is copied as is, but the bottom field is deinterlaced |
551 |
against the top field. */ |
552 |
FFMPEG_INLINE |
553 |
void deinterlace_bottom_field(uint8_t *dst, int dst_wrap, |
554 |
const uint8_t *src1, int src_wrap, |
555 |
int width, int height) |
556 |
{ |
557 |
const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2; |
558 |
int y; |
559 |
|
560 |
src_m2 = src1; |
561 |
src_m1 = src1; |
562 |
src_0=&src_m1[src_wrap]; |
563 |
src_p1=&src_0[src_wrap]; |
564 |
src_p2=&src_p1[src_wrap]; |
565 |
for(y=0;y<(height-2);y+=2) { |
566 |
memcpy(dst,src_m1,width); |
567 |
dst += dst_wrap; |
568 |
deinterlace_line(dst,src_m2,src_m1,src_0,src_p1,src_p2,width); |
569 |
src_m2 = src_0; |
570 |
src_m1 = src_p1; |
571 |
src_0 = src_p2; |
572 |
src_p1 += 2*src_wrap; |
573 |
src_p2 += 2*src_wrap; |
574 |
dst += dst_wrap; |
575 |
} |
576 |
memcpy(dst,src_m1,width); |
577 |
dst += dst_wrap; |
578 |
/* do last line */ |
579 |
deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width); |
580 |
} |
581 |
|
582 |
FFMPEG_INLINE |
583 |
int deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap, |
584 |
int width, int height) |
585 |
{ |
586 |
uint8_t *src_m1, *src_0, *src_p1, *src_p2; |
587 |
int y; |
588 |
uint8_t *buf = (uint8_t *)av_malloc(width); |
589 |
if (!buf) |
590 |
return AVERROR(ENOMEM); |
591 |
|
592 |
src_m1 = src1; |
593 |
memcpy(buf,src_m1,width); |
594 |
src_0=&src_m1[src_wrap]; |
595 |
src_p1=&src_0[src_wrap]; |
596 |
src_p2=&src_p1[src_wrap]; |
597 |
for(y=0;y<(height-2);y+=2) { |
598 |
deinterlace_line_inplace(buf,src_m1,src_0,src_p1,src_p2,width); |
599 |
src_m1 = src_p1; |
600 |
src_0 = src_p2; |
601 |
src_p1 += 2*src_wrap; |
602 |
src_p2 += 2*src_wrap; |
603 |
} |
604 |
/* do last line */ |
605 |
deinterlace_line_inplace(buf,src_m1,src_0,src_0,src_0,width); |
606 |
av_free(buf); |
607 |
return 0; |
608 |
} |
609 |
|
610 |
#ifdef __GNUC__ |
611 |
# pragma GCC diagnostic push |
612 |
# pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
613 |
#endif |
614 |
|
615 |
FFMPEG_INLINE |
616 |
int avpicture_deinterlace(AVPicture *dst, const AVPicture *src, |
617 |
enum AVPixelFormat pix_fmt, int width, int height) |
618 |
{ |
619 |
int i, ret; |
620 |
|
621 |
if (pix_fmt != AV_PIX_FMT_YUV420P && |
622 |
pix_fmt != AV_PIX_FMT_YUVJ420P && |
623 |
pix_fmt != AV_PIX_FMT_YUV422P && |
624 |
pix_fmt != AV_PIX_FMT_YUVJ422P && |
625 |
pix_fmt != AV_PIX_FMT_YUV444P && |
626 |
pix_fmt != AV_PIX_FMT_YUV411P && |
627 |
pix_fmt != AV_PIX_FMT_GRAY8) |
628 |
return -1; |
629 |
if ((width & 3) != 0 || (height & 3) != 0) |
630 |
return -1; |
631 |
|
632 |
for(i=0;i<3;i++) { |
633 |
if (i == 1) { |
634 |
switch(pix_fmt) { |
635 |
case AV_PIX_FMT_YUVJ420P: |
636 |
case AV_PIX_FMT_YUV420P: |
637 |
width >>= 1; |
638 |
height >>= 1; |
639 |
break; |
640 |
case AV_PIX_FMT_YUV422P: |
641 |
case AV_PIX_FMT_YUVJ422P: |
642 |
width >>= 1; |
643 |
break; |
644 |
case AV_PIX_FMT_YUV411P: |
645 |
width >>= 2; |
646 |
break; |
647 |
default: |
648 |
break; |
649 |
} |
650 |
if (pix_fmt == AV_PIX_FMT_GRAY8) { |
651 |
break; |
652 |
} |
653 |
} |
654 |
if (src == dst) { |
655 |
ret = deinterlace_bottom_field_inplace(dst->data[i], |
656 |
dst->linesize[i], |
657 |
width, height); |
658 |
if (ret < 0) |
659 |
return ret; |
660 |
} else { |
661 |
deinterlace_bottom_field(dst->data[i],dst->linesize[i], |
662 |
src->data[i], src->linesize[i], |
663 |
width, height); |
664 |
} |
665 |
} |
666 |
return 0; |
667 |
} |
668 |
|
669 |
#ifdef __GNUC__ |
670 |
# pragma GCC diagnostic pop |
671 |
#endif |
672 |
|
673 |
#endif |
674 |
|
449 |
#endif |
675 |
#endif |