[Ffmpeg-devel] Re: dv video format with 32 kHz audio?
Roman Shaposhnik
rvs
Wed May 31 04:51:19 CEST 2006
On Tue, 2006-05-30 at 00:29 +0300, Mikko Rapeli wrote:
> On Wed, Apr 26, 2006 at 09:57:19AM +0300, Mikko Rapeli wrote:
> > If/when I have more questions I'll bug you again.
>
> Ok, I've got stuck: I'm hitting the first AV_LOG_ERROR, "1 Can't process
> DV frame #%d. Insufficient audio data or severe sync problem.\n" in
> libavformat/dv.c/dv_assemble_frame with this patch, and the sound track
> does similar crackling as it did when I tried sample rate conversions in
> kino. I'm presuming that existing code does the sample rate conversions.
>
> Is that not the case or have I missed some other trivial thingy?
Ok, first of all -- what are you trying to accomplish here ? If you're
trying to add native support for 32KHz sound then I'm not against it
in principle (and I will apply a clean patch) but I have no interest
in working on it myself. Now here's why the current patch doesn't quite
cut it:
1. I don't want 32kHZ sound to be at a target level. Simply accept
such streams when they are given. Better yet -- issue a warning.
2. 32kHZ should only be accepted for IEC 61834 profile. It is illegal
for SMPTE profiles.
3. The hardest one: you have to figure out the correct sample
distribution policy akin to what's going on in
dv_profiles[] .audio_samples_dist. So that there's no popping
sound. AFAIK, the only document that might specify it is a
IEC DV spec.
Thanks,
Roman.
>
> -Mikko
>
> diff -ru ffmpegcvs-20060430/ffmpeg.c ffmpegcvs-20060430-mcf/ffmpeg.c
> --- ffmpegcvs-20060430/ffmpeg.c 2006-04-30 12:45:32.000000000 +0300
> +++ ffmpegcvs-20060430-mcf/ffmpeg.c 2006-05-30 00:02:39.000000000 +0300
> @@ -3847,7 +3847,7 @@
> audio_bit_rate = 448000;
> audio_sample_rate = 48000;
>
> - } else if(!strncmp(arg, "dv", 2)) {
> + } else if(!strcmp(arg, "dv48")) {
>
> opt_format("dv");
>
> @@ -3859,6 +3859,18 @@
> audio_sample_rate = 48000;
> audio_channels = 2;
>
> + } else if(!strcmp(arg, "dv32")) {
> +
> + opt_format("dv");
> +
> + opt_frame_size(norm ? "720x480" : "720x576");
> + opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
> + (norm ? "yuv411p" : "yuv420p"));
> + opt_frame_rate(frame_rates[norm]);
> +
> + audio_sample_rate = 32000;
> + audio_channels = 2;
> +
> } else {
> fprintf(stderr, "Unknown target: %s\n", arg);
> exit(1);
> @@ -3927,7 +3939,7 @@
> { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
> { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
> { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" },
> - { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
> + { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv48\", \"dv32\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
> { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
> { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
> { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
> diff -ru ffmpegcvs-20060430/libavformat/dv.c ffmpegcvs-20060430-mcf/libavformat/dv.c
> --- ffmpegcvs-20060430/libavformat/dv.c 2006-04-30 12:45:41.000000000 +0300
> +++ ffmpegcvs-20060430-mcf/libavformat/dv.c 2006-05-30 00:05:19.000000000 +0300
> @@ -228,11 +228,25 @@
> (tc.tm_hour % 10); /* Units of hours */
> break;
> case dv_audio_source: /* AAUX source pack */
> - buf[1] = (0 << 7) | /* locked mode */
> - (1 << 6) | /* reserved -- always 1 */
> - (dv_audio_frame_size(c->sys, c->frames) -
> - c->sys->audio_min_samples[0]);
> + /*
> + * Where do we get i in ast[i]? Which channel
> + * are we looking at? What if channels have different
> + * sample rates? Cheez. Channel 0 is just a guess...
> + */
> + if (c->ast[0]->codec->sample_rate == 32000) {
> + buf[1] = (0 << 7) | /* locked mode */
> + (1 << 6) | /* reserved -- always 1 */
> + (dv_audio_frame_size(c->sys, c->frames) -
> + c->sys->audio_min_samples[2]);
> /* # of samples */
> + } else /* if (c->ast[0]->codec->sample_rate == 48000) */ {
> + buf[1] = (0 << 7) | /* locked mode */
> + (1 << 6) | /* reserved -- always 1 */
> + (dv_audio_frame_size(c->sys, c->frames) -
> + c->sys->audio_min_samples[0]);
> + /* # of samples */
> + }
> +
> buf[2] = (0 << 7) | /* multi-stereo */
> (0 << 5) | /* #of audio channels per block: 0 -- 1 channel */
> (0 << 4) | /* pair bit: 0 -- one pair of channels */
> @@ -241,10 +255,21 @@
> (1 << 6) | /* multi-language flag */
> (c->sys->dsf << 5) | /* system: 60fields/50fields */
> (apt << 1);/* definition: 0 -- 25Mbps, 2 -- 50Mbps */
> - buf[4] = (1 << 7) | /* emphasis: 1 -- off */
> - (0 << 6) | /* emphasis time constant: 0 -- reserved */
> - (0 << 3) | /* frequency: 0 -- 48Khz, 1 -- 44,1Khz, 2 -- 32Khz */
> - 0; /* quantization: 0 -- 16bit linear, 1 -- 12bit nonlinear */
> + if (c->ast[0]->codec->sample_rate == 32000) {
> + buf[4] = (1 << 7) | /* emphasis: 1 -- off */
> + (0 << 6) | /* emphasis time constant: 0 -- reserved */
> + (2 << 3) | /* frequency: 0 -- 48Khz, 1 -- 44,1Khz, 2 --
> + 32Khz */
> + 0; /* quantization: 0 -- 16bit linear, 1 -- 12bi
> +t nonlinear */
> + } else /* if (c->ast[i]->codec->sample_rate == 48000 */ {
> + buf[4] = (1 << 7) | /* emphasis: 1 -- off */
> + (0 << 6) | /* emphasis time constant: 0 -- reserved */
> + (0 << 3) | /* frequency: 0 -- 48Khz, 1 -- 44,1Khz, 2 --
> + 32Khz */
> + 0; /* quantization: 0 -- 16bit linear, 1 -- 12bi
> +t nonlinear */
> + }
> break;
> case dv_audio_control:
> buf[1] = (0 << 6) | /* copy protection: 0 -- unrestricted */
> @@ -660,7 +685,7 @@
> if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
> /* FIXME: we have to have more sensible approach than this one */
> if (c->has_video)
> - av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient audio data or severe sync problem.\n", c->frames);
> + av_log(st->codec, AV_LOG_ERROR, "1 Can't process DV frame #%d. Insufficient audio data or severe sync problem.\n", c->frames);
>
> dv_inject_video(c, data, *frame);
> c->has_video = 1;
> @@ -691,7 +716,7 @@
> }
> /* FIXME: we have to have more sensible approach than this one */
> if (fifo_size(&c->audio_data[i], c->audio_data[i].rptr) + data_size >= 100*AVCODEC_MAX_AUDIO_FRAME_SIZE)
> - av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames);
> + av_log(st->codec, AV_LOG_ERROR, "2 Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames);
> fifo_write(&c->audio_data[i], (uint8_t *)data, data_size, &c->audio_data[i].wptr);
> }
> }
> @@ -735,7 +760,9 @@
> goto bail_out;
> for (i=0; i<c->n_ast; i++) {
> if (c->ast[i] && (c->ast[i]->codec->codec_id != CODEC_ID_PCM_S16LE ||
> - c->ast[i]->codec->sample_rate != 48000 ||
> + ((c->ast[i]->codec->sample_rate != 48000) &&
> + (c->ast[i]->codec->sample_rate != 44100) &&
> + (c->ast[i]->codec->sample_rate != 32000)) ||
> c->ast[i]->codec->channels != 2))
> goto bail_out;
> }
More information about the ffmpeg-devel
mailing list