On Tue, 03 Jan 2012 18:37:37 -0500, Justin Ruggles <[email protected]> 
wrote:
> On 01/03/2012 01:43 PM, Anton Khirnov wrote:
> 
> > 
> > On Sat, 31 Dec 2011 14:51:44 -0500, Justin Ruggles 
> > <[email protected]> wrote:
> >> ---
> >>  avconv.c |  190 
> >> ++++++++++++++++++++++++++++++--------------------------------
> >>  1 files changed, 91 insertions(+), 99 deletions(-)
> >>
> >> diff --git a/avconv.c b/avconv.c
> >> index 2a45c8e..376101f 100644
> >> --- a/avconv.c
> >> +++ b/avconv.c
> >> @@ -136,8 +136,7 @@ static float dts_delta_threshold = 10;
> >>  static int print_stats = 1;
> >>  
> >>  static uint8_t *audio_buf;
> >> -static uint8_t *audio_out;
> >> -static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
> >> +static unsigned int allocated_audio_buf_size;
> >>  
> >>  #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
> >>  
> >> @@ -688,8 +687,7 @@ void exit_program(int ret)
> >>  
> >>      uninit_opts();
> >>      av_free(audio_buf);
> >> -    av_free(audio_out);
> >> -    allocated_audio_buf_size = allocated_audio_out_size = 0;
> >> +    allocated_audio_buf_size = 0;
> >>  
> >>  #if CONFIG_AVFILTER
> >>      avfilter_uninit();
> >> @@ -887,18 +885,70 @@ static void generate_silence(uint8_t* buf, enum 
> >> AVSampleFormat sample_fmt, size_
> >>      memset(buf, fill_char, size);
> >>  }
> >>  
> >> +static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
> >> +                              const uint8_t *buf, int buf_size)
> >> +{
> >> +    AVCodecContext *enc = ost->st->codec;
> >> +    AVFrame frame;
> > 
> > AVFrame should be allocated properly.
> 
> 
> indeed. i'll fix that.
> 
> > 
> >> +    AVPacket pkt;
> >> +    int ret;
> >> +
> >> +    av_init_packet(&pkt);
> >> +    pkt.data = NULL;
> >> +    pkt.size = 0;
> >> +
> >> +    if (buf) {
> >> +        avcodec_get_frame_defaults(&frame);
> >> +        frame.nb_samples  = buf_size /
> >> +                            (enc->channels * 
> >> av_get_bytes_per_sample(enc->sample_fmt));
> >> +        if ((ret = avcodec_fill_audio_frame(&frame, enc->channels, 
> >> enc->sample_fmt,
> >> +                                            buf, buf_size, 1)) < 0) {
> >> +            av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
> >> +            exit_program(1);
> >> +        }
> >> +        frame.pts = ost->sync_opts;
> >> +    }
> >> +
> >> +    if (avcodec_encode_audio2(enc, &pkt, buf ? &frame : NULL) < 0) {
> >> +        av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
> >> +        exit_program(1);
> >> +    }
> >> +
> >> +    pkt.stream_index = ost->index;
> >> +    if (pkt.pts != AV_NOPTS_VALUE)
> >> +        pkt.pts      = av_rescale_q(pkt.pts,      enc->time_base, 
> >> ost->st->time_base);
> >> +    if (pkt.duration > 0)
> >> +        pkt.duration = av_rescale_q(pkt.duration, enc->time_base, 
> >> ost->st->time_base);
> >> +
> >> +    /* FIXME: remove this once all encoders that support
> >> +              CODEC_CAP_SMALL_LAST_FRAME use encode2() */
> >> +    if (buf && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME &&
> >> +        frame.nb_samples < enc->frame_size) {
> >> +        pkt.duration = av_rescale_q(frame.nb_samples,
> >> +                                    (AVRational){ 1, enc->sample_rate },
> >> +                                    ost->st->time_base);
> >> +    }
> >> +
> >> +    write_frame(s, &pkt, enc, ost->bitstream_filters);
> > 
> > Shouldn't you test for pkt.size > 0 here?
> 
> that's questionable. current code sends 0-size packets to write_frame(),
> so i didn't change it here.
> 

Yes, but they are discarded by a hack in av_interleaved_write_frame().

There should be a way to distinguish between "encoder didn't output
anything" and  "encoder produced a packet with 0-size data, but
containing some other nontrivial information". We should try to mux the
latter, but not the former.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to