comparison dvdata.h @ 7714:f0f8bb920b24 libavcodec

Introducing video_stype for holding the value of VAUX source pack and simplifying dv_frame_profile
author romansh
date Thu, 28 Aug 2008 19:21:59 +0000
parents 685ef77c9fe5
children e8f71784062e
comparison
equal deleted inserted replaced
7713:f1e68b2dc389 7714:f0f8bb920b24
36 * 525/60 and 625/50, but the plans are to use it for various 36 * 525/60 and 625/50, but the plans are to use it for various
37 * DV specs as well (e.g. SMPTE314M vs. IEC 61834). 37 * DV specs as well (e.g. SMPTE314M vs. IEC 61834).
38 */ 38 */
39 typedef struct DVprofile { 39 typedef struct DVprofile {
40 int dsf; /* value of the dsf in the DV header */ 40 int dsf; /* value of the dsf in the DV header */
41 int video_stype; /* stype for VAUX source pack */
41 int frame_size; /* total size of one frame in bytes */ 42 int frame_size; /* total size of one frame in bytes */
42 int difseg_size; /* number of DIF segments per DIF channel */ 43 int difseg_size; /* number of DIF segments per DIF channel */
43 int n_difchan; /* number of DIF channels per frame */ 44 int n_difchan; /* number of DIF channels per frame */
44 int frame_rate; 45 int frame_rate;
45 int frame_rate_base; 46 int frame_rate_base;
2531 80, 80, 80, 80, 80, 80, 64, 64, 2532 80, 80, 80, 80, 80, 80, 64, 64,
2532 }; 2533 };
2533 2534
2534 static const DVprofile dv_profiles[] = { 2535 static const DVprofile dv_profiles[] = {
2535 { .dsf = 0, 2536 { .dsf = 0,
2537 .video_stype = 0x0,
2536 .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */ 2538 .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
2537 .difseg_size = 10, 2539 .difseg_size = 10,
2538 .n_difchan = 1, 2540 .n_difchan = 1,
2539 .frame_rate = 30000, 2541 .frame_rate = 30000,
2540 .ltc_divisor = 30, 2542 .ltc_divisor = 30,
2550 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */ 2552 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */
2551 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ 2553 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
2552 .audio_shuffle = dv_audio_shuffle525, 2554 .audio_shuffle = dv_audio_shuffle525,
2553 }, 2555 },
2554 { .dsf = 1, 2556 { .dsf = 1,
2557 .video_stype = 0x0,
2555 .frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */ 2558 .frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */
2556 .difseg_size = 12, 2559 .difseg_size = 12,
2557 .n_difchan = 1, 2560 .n_difchan = 1,
2558 .frame_rate = 25, 2561 .frame_rate = 25,
2559 .frame_rate_base = 1, 2562 .frame_rate_base = 1,
2569 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ 2572 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
2570 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 2573 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
2571 .audio_shuffle = dv_audio_shuffle625, 2574 .audio_shuffle = dv_audio_shuffle625,
2572 }, 2575 },
2573 { .dsf = 1, 2576 { .dsf = 1,
2577 .video_stype = 0x0,
2574 .frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */ 2578 .frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */
2575 .difseg_size = 12, 2579 .difseg_size = 12,
2576 .n_difchan = 1, 2580 .n_difchan = 1,
2577 .frame_rate = 25, 2581 .frame_rate = 25,
2578 .frame_rate_base = 1, 2582 .frame_rate_base = 1,
2588 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ 2592 .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
2589 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, 2593 .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
2590 .audio_shuffle = dv_audio_shuffle625, 2594 .audio_shuffle = dv_audio_shuffle625,
2591 }, 2595 },
2592 { .dsf = 0, 2596 { .dsf = 0,
2597 .video_stype = 0x4,
2593 .frame_size = 240000, /* SMPTE-314M - 525/60 (NTSC) 50 Mbps */ 2598 .frame_size = 240000, /* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
2594 .difseg_size = 10, /* also known as "DVCPRO50" */ 2599 .difseg_size = 10, /* also known as "DVCPRO50" */
2595 .n_difchan = 2, 2600 .n_difchan = 2,
2596 .frame_rate = 30000, 2601 .frame_rate = 30000,
2597 .ltc_divisor = 30, 2602 .ltc_divisor = 30,
2607 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */ 2612 .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */
2608 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ 2613 .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
2609 .audio_shuffle = dv_audio_shuffle525, 2614 .audio_shuffle = dv_audio_shuffle525,
2610 }, 2615 },
2611 { .dsf = 1, 2616 { .dsf = 1,
2617 .video_stype = 0x4,
2612 .frame_size = 288000, /* SMPTE-314M - 625/50 (PAL) 50 Mbps */ 2618 .frame_size = 288000, /* SMPTE-314M - 625/50 (PAL) 50 Mbps */
2613 .difseg_size = 12, /* also known as "DVCPRO50" */ 2619 .difseg_size = 12, /* also known as "DVCPRO50" */
2614 .n_difchan = 2, 2620 .n_difchan = 2,
2615 .frame_rate = 25, 2621 .frame_rate = 25,
2616 .frame_rate_base = 1, 2622 .frame_rate_base = 1,
2661 /* maximum number of blocks per macroblock in any DV format */ 2667 /* maximum number of blocks per macroblock in any DV format */
2662 #define DV_MAX_BPM 8 2668 #define DV_MAX_BPM 8
2663 2669
2664 static inline const DVprofile* dv_frame_profile(const uint8_t* frame) 2670 static inline const DVprofile* dv_frame_profile(const uint8_t* frame)
2665 { 2671 {
2666 if ((frame[3] & 0x80) == 0) { /* DSF flag */ 2672 int i;
2667 /* it's an NTSC format */ 2673
2668 if ((frame[80*5 + 48 + 3] & 0x4) && (frame[80*5 + 48] == dv_video_source)) { /* 4:2:2 sampling */ 2674 int dsf = (frame[3] & 0x80) >> 7;
2669 return &dv_profiles[3]; /* NTSC 50Mbps */ 2675
2670 } else { /* 4:1:1 sampling */ 2676 int stype = frame[80*5 + 48 + 3] & 0x1f;
2671 return &dv_profiles[0]; /* NTSC 25Mbps */ 2677
2672 } 2678 /* 576i50 25Mbps 4:1:1 is a special case */
2673 } else { 2679 if (dsf == 1 && stype == 0 && frame[5] & 0x07) {
2674 /* it's a PAL format */ 2680 return &dv_profiles[2];
2675 if ((frame[80*5 + 48 + 3] & 0x4) && (frame[80*5 + 48] == dv_video_source)) { /* 4:2:2 sampling */ 2681 }
2676 return &dv_profiles[4]; /* PAL 50Mbps */ 2682
2677 } else if ((frame[5] & 0x07) == 0) { /* APT flag */ 2683 for (i=0; i<sizeof(dv_profiles)/sizeof(DVprofile); i++)
2678 return &dv_profiles[1]; /* PAL 25Mbps 4:2:0 */ 2684 if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype)
2679 } else 2685 return &dv_profiles[i];
2680 return &dv_profiles[2]; /* PAL 25Mbps 4:1:1 */ 2686
2681 } 2687 return NULL;
2682 } 2688 }
2683 2689
2684 static inline const DVprofile* dv_codec_profile(AVCodecContext* codec) 2690 static inline const DVprofile* dv_codec_profile(AVCodecContext* codec)
2685 { 2691 {
2686 int i; 2692 int i;