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.

> +    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?

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

Reply via email to