On 5/15/17 1:16 PM, Martin Storsjö wrote:
> +        struct AudioFrameBuffer *cur_buffer, *next_buffer;
> +        cur_buffer  = 
> &avctx->internal->audio_frames[avctx->internal->cur_audio_frame];
> +        next_buffer = 
> &avctx->internal->audio_frames[!avctx->internal->cur_audio_frame];
> +        if (frame) {
> +            if (avctx->internal->samples_to_skip >= frame->nb_samples) {
> +                avctx->internal->samples_to_skip -= frame->nb_samples;
> +                av_packet_unref(avpkt);
> +                av_init_packet(avpkt);
> +                return 0;
> +            }
> +            if (avctx->internal->samples_to_skip || cur_buffer->nb_samples) {
> +                int src_offset = 0;
> +                int samples;
> +
> +                if (avctx->internal->samples_to_skip) {
> +                    src_offset = avctx->internal->samples_to_skip;
> +                    avctx->internal->samples_to_skip = 0;
> +                }
> +
> +                if (cur_buffer->nb_samples == 0) {
> +                    cur_buffer->pts = frame->pts + av_rescale_q(src_offset, 
> avctx->time_base, (AVRational){ 1, avctx->sample_rate });
> +                }
> +                samples = FFMIN(avctx->frame_size - cur_buffer->nb_samples,
> +                                frame->nb_samples - src_offset);
> +                av_samples_copy(cur_buffer->data, frame->extended_data, 
> cur_buffer->nb_samples, src_offset, samples, avctx->channels, 
> avctx->sample_fmt);
> +                cur_buffer->nb_samples += samples;
> +                src_offset += samples;
> +                if (cur_buffer->nb_samples != avctx->frame_size) {
> +                    av_packet_unref(avpkt);
> +                    av_init_packet(avpkt);
> +                    return 0;
> +                }
> +                tmp2               = *frame;
> +                tmp2.extended_data = cur_buffer->data;
> +                tmp2.nb_samples    = avctx->frame_size;
> +                tmp2.pts           = cur_buffer->pts;
> +                memcpy(tmp2.data, tmp2.extended_data,
> +                       FFMIN(AV_NUM_DATA_POINTERS, avctx->channels) * 
> sizeof(uint8_t*));
> +
> +                avctx->internal->cur_audio_frame = 
> !avctx->internal->cur_audio_frame;
> +                next_buffer->nb_samples = 0;
> +
> +                if (src_offset < frame->nb_samples) {
> +                    samples = FFMIN(frame->nb_samples - src_offset, 
> avctx->frame_size); // This should always be less than avctx->frame_size
> +                    next_buffer->pts = frame->pts + av_rescale_q(src_offset, 
> avctx->time_base, (AVRational){ 1, avctx->sample_rate });
> +                    av_samples_copy(next_buffer->data, frame->extended_data, 
> next_buffer->nb_samples, src_offset, samples, avctx->channels, 
> avctx->sample_fmt);
> +                    next_buffer->nb_samples += samples;
> +                }
> +
> +                frame = &tmp2;
> +            }
> +        }
> +        if (!frame && cur_buffer->nb_samples > 0) {
> +            memset(&tmp2, 0, sizeof(tmp2));
> +            tmp2.linesize[0]    = cur_buffer->linesize[0];
> +            tmp2.extended_data  = cur_buffer->data;
> +            tmp2.nb_samples     = cur_buffer->nb_samples;
> +            tmp2.format         = avctx->sample_fmt;
> +            tmp2.sample_rate    = avctx->sample_rate;
> +            tmp2.channel_layout = avctx->channel_layout;
> +            tmp2.pts = cur_buffer->pts;
> +            memcpy(tmp2.data, tmp2.extended_data,
> +                   FFMIN(AV_NUM_DATA_POINTERS, avctx->channels) * 
> sizeof(uint8_t*));
> +            cur_buffer->nb_samples = 0;
> +            frame = &tmp2;
> +        }

This should be a stand alone function, same for the one in utils.

Beside that I'd look again on how you are feeding out the last samples
since I'm not sure it is the best way to do that.

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

Reply via email to