Commit c89cb589 authored by Roman Shaposhnik's avatar Roman Shaposhnik

Making block size in bits variable and dependent on the DV spec

Originally committed as revision 14842 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 713c1aa9
...@@ -253,10 +253,6 @@ typedef struct BlockInfo { ...@@ -253,10 +253,6 @@ typedef struct BlockInfo {
int shift_offset; int shift_offset;
} BlockInfo; } BlockInfo;
/* block size in bits */
static const uint16_t block_sizes[6] = {
112, 112, 112, 112, 80, 80
};
/* bit budget for AC only in 5 MBs */ /* bit budget for AC only in 5 MBs */
static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5; static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
/* see dv_88_areas and dv_248_areas for details */ /* see dv_88_areas and dv_248_areas for details */
...@@ -384,7 +380,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s, ...@@ -384,7 +380,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
mb = mb1; mb = mb1;
block = block1; block = block1;
for(j = 0;j < s->sys->bpm; j++) { for(j = 0;j < s->sys->bpm; j++) {
last_index = block_sizes[j]; last_index = s->sys->block_sizes[j];
init_get_bits(&gb, buf_ptr, last_index); init_get_bits(&gb, buf_ptr, last_index);
/* get the dc */ /* get the dc */
...@@ -911,7 +907,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s, ...@@ -911,7 +907,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
enc_blk->dct_mode ? dv_weight_248 : dv_weight_88, enc_blk->dct_mode ? dv_weight_248 : dv_weight_88,
j/4); j/4);
init_put_bits(pb, ptr, block_sizes[j]/8); init_put_bits(pb, ptr, s->sys->block_sizes[j]/8);
put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2)); put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
put_bits(pb, 1, enc_blk->dct_mode); put_bits(pb, 1, enc_blk->dct_mode);
put_bits(pb, 2, enc_blk->cno); put_bits(pb, 2, enc_blk->cno);
...@@ -920,7 +916,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s, ...@@ -920,7 +916,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
enc_blk->bit_size[2] + enc_blk->bit_size[3]; enc_blk->bit_size[2] + enc_blk->bit_size[3];
++enc_blk; ++enc_blk;
++pb; ++pb;
ptr += block_sizes[j]/8; ptr += s->sys->block_sizes[j]/8;
} }
} }
......
...@@ -50,6 +50,7 @@ typedef struct DVprofile { ...@@ -50,6 +50,7 @@ typedef struct DVprofile {
const uint16_t *video_place; /* positions of all DV macro blocks */ const uint16_t *video_place; /* positions of all DV macro blocks */
enum PixelFormat pix_fmt; /* picture pixel format */ enum PixelFormat pix_fmt; /* picture pixel format */
int bpm; /* blocks per macroblock */ int bpm; /* blocks per macroblock */
const uint8_t *block_sizes; /* AC block sizes, in bits */
int audio_stride; /* size of audio_shuffle table */ int audio_stride; /* size of audio_shuffle table */
int audio_min_samples[3];/* min ammount of audio samples */ int audio_min_samples[3];/* min ammount of audio samples */
/* for 48Khz, 44.1Khz and 32Khz */ /* for 48Khz, 44.1Khz and 32Khz */
...@@ -2521,6 +2522,15 @@ static const av_unused int dv_audio_frequency[3] = { ...@@ -2521,6 +2522,15 @@ static const av_unused int dv_audio_frequency[3] = {
48000, 44100, 32000, 48000, 44100, 32000,
}; };
/* macroblock bit budgets */
static const uint8_t block_sizes_dv2550[8] = {
112, 112, 112, 112, 80, 80, 0, 0,
};
static const uint8_t block_sizes_dv100[8] = {
80, 80, 80, 80, 80, 80, 64, 64,
};
static const DVprofile dv_profiles[] = { static const DVprofile dv_profiles[] = {
{ .dsf = 0, { .dsf = 0,
.frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */ .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
...@@ -2535,6 +2545,7 @@ static const DVprofile dv_profiles[] = { ...@@ -2535,6 +2545,7 @@ static const DVprofile dv_profiles[] = {
.video_place = dv_place_411, .video_place = dv_place_411,
.pix_fmt = PIX_FMT_YUV411P, .pix_fmt = PIX_FMT_YUV411P,
.bpm = 6, .bpm = 6,
.block_sizes = block_sizes_dv2550,
.audio_stride = 90, .audio_stride = 90,
.audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
...@@ -2553,6 +2564,7 @@ static const DVprofile dv_profiles[] = { ...@@ -2553,6 +2564,7 @@ static const DVprofile dv_profiles[] = {
.video_place = dv_place_420, .video_place = dv_place_420,
.pix_fmt = PIX_FMT_YUV420P, .pix_fmt = PIX_FMT_YUV420P,
.bpm = 6, .bpm = 6,
.block_sizes = block_sizes_dv2550,
.audio_stride = 108, .audio_stride = 108,
.audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
...@@ -2571,6 +2583,7 @@ static const DVprofile dv_profiles[] = { ...@@ -2571,6 +2583,7 @@ static const DVprofile dv_profiles[] = {
.video_place = dv_place_411P, .video_place = dv_place_411P,
.pix_fmt = PIX_FMT_YUV411P, .pix_fmt = PIX_FMT_YUV411P,
.bpm = 6, .bpm = 6,
.block_sizes = block_sizes_dv2550,
.audio_stride = 108, .audio_stride = 108,
.audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
...@@ -2589,6 +2602,7 @@ static const DVprofile dv_profiles[] = { ...@@ -2589,6 +2602,7 @@ static const DVprofile dv_profiles[] = {
.video_place = dv_place_422_525, .video_place = dv_place_422_525,
.pix_fmt = PIX_FMT_YUV422P, .pix_fmt = PIX_FMT_YUV422P,
.bpm = 6, .bpm = 6,
.block_sizes = block_sizes_dv2550,
.audio_stride = 90, .audio_stride = 90,
.audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */ .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
...@@ -2607,6 +2621,7 @@ static const DVprofile dv_profiles[] = { ...@@ -2607,6 +2621,7 @@ static const DVprofile dv_profiles[] = {
.video_place = dv_place_422_625, .video_place = dv_place_422_625,
.pix_fmt = PIX_FMT_YUV422P, .pix_fmt = PIX_FMT_YUV422P,
.bpm = 6, .bpm = 6,
.block_sizes = block_sizes_dv2550,
.audio_stride = 108, .audio_stride = 108,
.audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment