- av_packet_unref (&packet);
-
- av_init_packet (&packet);
- packet.data = 0;
- packet.size = 0;
-
- avcodec_encode_audio2 (_video_codec_context, &packet, 0, &got_packet);
- if (got_packet) {
- packet.stream_index = 0;
- av_interleaved_write_frame (_format_context, &packet);
- } else {
- flushed_audio = true;
- }
- av_packet_unref (&packet);
- }
-
- av_write_trailer (_format_context);
-
- avcodec_close (_video_codec_context);
- avcodec_close (_audio_codec_context);
- avio_close (_format_context->pb);
- avformat_free_context (_format_context);
-}
-
-void
-FFmpegEncoder::video (shared_ptr<PlayerVideo> video, DCPTime time)
-{
- shared_ptr<Image> image = video->image (
- bind (&Log::dcp_log, _film->log().get(), _1, _2),
- bind (&force_pixel_format, _1, _pixel_format),
- true,
- false
- );
-
- AVFrame* frame = av_frame_alloc ();
- DCPOMATIC_ASSERT (frame);
-
- for (int i = 0; i < 3; ++i) {
- size_t const size = image->stride()[i] * image->size().height;
- AVBufferRef* buffer = av_buffer_alloc (size);
- DCPOMATIC_ASSERT (buffer);
- /* XXX: inefficient */
- memcpy (buffer->data, image->data()[i], size);
- frame->buf[i] = av_buffer_ref (buffer);
- frame->data[i] = buffer->data;
- frame->linesize[i] = image->stride()[i];
- av_buffer_unref (&buffer);
- }
-
- frame->width = image->size().width;
- frame->height = image->size().height;
- frame->format = _pixel_format;
- frame->pts = time.seconds() / av_q2d (_video_stream->time_base);
-
- AVPacket packet;
- av_init_packet (&packet);
- packet.data = 0;
- packet.size = 0;