FFmpeg
ffmpeg_enc.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <math.h>
20 #include <stdint.h>
21 
22 #include "ffmpeg.h"
23 
24 #include "libavutil/avassert.h"
25 #include "libavutil/avstring.h"
26 #include "libavutil/avutil.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/display.h"
29 #include "libavutil/eval.h"
30 #include "libavutil/frame.h"
31 #include "libavutil/intreadwrite.h"
32 #include "libavutil/log.h"
33 #include "libavutil/mem.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/rational.h"
36 #include "libavutil/time.h"
37 #include "libavutil/timestamp.h"
38 
39 #include "libavcodec/avcodec.h"
40 
41 typedef struct EncoderPriv {
43 
44  void *log_parent;
45  char log_name[32];
46 
47  // combined size of all the packets received from the encoder
48  uint64_t data_size;
49 
50  // number of packets received from the encoder
51  uint64_t packets_encoded;
52 
53  int opened;
55 
57  unsigned sch_idx;
58 } EncoderPriv;
59 
61 {
62  return (EncoderPriv*)enc;
63 }
64 
65 // data that is local to the decoder thread and not visible outside of it
66 typedef struct EncoderThread {
70 
71 void enc_free(Encoder **penc)
72 {
73  Encoder *enc = *penc;
74 
75  if (!enc)
76  return;
77 
78  if (enc->enc_ctx)
79  av_freep(&enc->enc_ctx->stats_in);
81 
82  av_freep(penc);
83 }
84 
85 static const char *enc_item_name(void *obj)
86 {
87  const EncoderPriv *ep = obj;
88 
89  return ep->log_name;
90 }
91 
92 static const AVClass enc_class = {
93  .class_name = "Encoder",
94  .version = LIBAVUTIL_VERSION_INT,
95  .parent_log_context_offset = offsetof(EncoderPriv, log_parent),
96  .item_name = enc_item_name,
97 };
98 
99 int enc_alloc(Encoder **penc, const AVCodec *codec,
100  Scheduler *sch, unsigned sch_idx, void *log_parent)
101 {
102  EncoderPriv *ep;
103  int ret = 0;
104 
105  *penc = NULL;
106 
107  ep = av_mallocz(sizeof(*ep));
108  if (!ep)
109  return AVERROR(ENOMEM);
110 
111  ep->e.class = &enc_class;
112  ep->log_parent = log_parent;
113 
114  ep->sch = sch;
115  ep->sch_idx = sch_idx;
116 
117  snprintf(ep->log_name, sizeof(ep->log_name), "enc:%s", codec->name);
118 
119  ep->e.enc_ctx = avcodec_alloc_context3(codec);
120  if (!ep->e.enc_ctx) {
121  ret = AVERROR(ENOMEM);
122  goto fail;
123  }
124 
125  *penc = &ep->e;
126 
127  return 0;
128 fail:
129  enc_free((Encoder**)&ep);
130  return ret;
131 }
132 
134  AVBufferRef *frames_ref)
135 {
136  const AVCodecHWConfig *config;
137  HWDevice *dev = NULL;
138 
139  if (frames_ref &&
140  ((AVHWFramesContext*)frames_ref->data)->format ==
141  enc_ctx->pix_fmt) {
142  // Matching format, will try to use hw_frames_ctx.
143  } else {
144  frames_ref = NULL;
145  }
146 
147  for (int i = 0;; i++) {
148  config = avcodec_get_hw_config(enc_ctx->codec, i);
149  if (!config)
150  break;
151 
152  if (frames_ref &&
154  (config->pix_fmt == AV_PIX_FMT_NONE ||
155  config->pix_fmt == enc_ctx->pix_fmt)) {
156  av_log(e, AV_LOG_VERBOSE, "Using input "
157  "frames context (format %s) with %s encoder.\n",
158  av_get_pix_fmt_name(enc_ctx->pix_fmt),
159  enc_ctx->codec->name);
160  enc_ctx->hw_frames_ctx = av_buffer_ref(frames_ref);
161  if (!enc_ctx->hw_frames_ctx)
162  return AVERROR(ENOMEM);
163  return 0;
164  }
165 
166  if (!dev &&
168  dev = hw_device_get_by_type(config->device_type);
169  }
170 
171  if (dev) {
172  av_log(e, AV_LOG_VERBOSE, "Using device %s "
173  "(type %s) with %s encoder.\n", dev->name,
174  av_hwdevice_get_type_name(dev->type), enc_ctx->codec->name);
175  enc_ctx->hw_device_ctx = av_buffer_ref(dev->device_ref);
176  if (!enc_ctx->hw_device_ctx)
177  return AVERROR(ENOMEM);
178  } else {
179  // No device required, or no device available.
180  }
181  return 0;
182 }
183 
184 int enc_open(void *opaque, const AVFrame *frame)
185 {
186  OutputStream *ost = opaque;
187  InputStream *ist = ost->ist;
188  Encoder *e = ost->enc;
189  EncoderPriv *ep = ep_from_enc(e);
190  AVCodecContext *enc_ctx = e->enc_ctx;
191  Decoder *dec = NULL;
192  const AVCodec *enc = enc_ctx->codec;
193  OutputFile *of = ost->file;
194  FrameData *fd;
195  int frame_samples = 0;
196  int ret;
197 
198  if (ep->opened)
199  return 0;
200 
201  // frame is always non-NULL for audio and video
203 
204  if (frame) {
205  av_assert0(frame->opaque_ref);
206  fd = (FrameData*)frame->opaque_ref->data;
207 
210  if (ret < 0)
211  return ret;
212  }
213 
214  if (ist)
215  dec = ist->decoder;
216 
217  // the timebase is chosen by filtering code
218  if (ost->type == AVMEDIA_TYPE_AUDIO || ost->type == AVMEDIA_TYPE_VIDEO) {
219  enc_ctx->time_base = frame->time_base;
220  enc_ctx->framerate = fd->frame_rate_filter;
221  }
222 
223  switch (enc_ctx->codec_type) {
224  case AVMEDIA_TYPE_AUDIO:
225  av_assert0(frame->format != AV_SAMPLE_FMT_NONE &&
226  frame->sample_rate > 0 &&
227  frame->ch_layout.nb_channels > 0);
228  enc_ctx->sample_fmt = frame->format;
229  enc_ctx->sample_rate = frame->sample_rate;
230  if (!enc_ctx->frame_size && (!(enc->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) ||
232  enc_ctx->frame_size = frame->nb_samples;
233  ret = av_channel_layout_copy(&enc_ctx->ch_layout, &frame->ch_layout);
234  if (ret < 0)
235  return ret;
236 
237  if (ost->bits_per_raw_sample)
238  enc_ctx->bits_per_raw_sample = ost->bits_per_raw_sample;
239  else
241  av_get_bytes_per_sample(enc_ctx->sample_fmt) << 3);
242  break;
243 
244  case AVMEDIA_TYPE_VIDEO: {
245  av_assert0(frame->format != AV_PIX_FMT_NONE &&
246  frame->width > 0 &&
247  frame->height > 0);
248  enc_ctx->width = frame->width;
249  enc_ctx->height = frame->height;
250  enc_ctx->sample_aspect_ratio =
251  ost->frame_aspect_ratio.num ? // overridden by the -aspect cli option
252  av_mul_q(ost->frame_aspect_ratio, (AVRational){ enc_ctx->height, enc_ctx->width }) :
253  frame->sample_aspect_ratio;
254 
255  enc_ctx->pix_fmt = frame->format;
256 
257  if (ost->bits_per_raw_sample)
258  enc_ctx->bits_per_raw_sample = ost->bits_per_raw_sample;
259  else
261  av_pix_fmt_desc_get(enc_ctx->pix_fmt)->comp[0].depth);
262 
263  /**
264  * The video color properties should always be in sync with the user-
265  * requested values, since we forward them to the filter graph.
266  */
267  enc_ctx->color_range = frame->color_range;
268  enc_ctx->color_primaries = frame->color_primaries;
269  enc_ctx->color_trc = frame->color_trc;
270  enc_ctx->colorspace = frame->colorspace;
271  enc_ctx->alpha_mode = frame->alpha_mode;
272 
273  /* Video properties which are not part of filter graph negotiation */
275  enc_ctx->chroma_sample_location = frame->chroma_location;
276  } else if (enc_ctx->chroma_sample_location != frame->chroma_location &&
277  frame->chroma_location != AVCHROMA_LOC_UNSPECIFIED) {
279  "Requested chroma sample location '%s' does not match the "
280  "frame tagged sample location '%s'; result may be incorrect.\n",
282  av_chroma_location_name(frame->chroma_location));
283  }
284 
286  (frame->flags & AV_FRAME_FLAG_INTERLACED)) {
287  int top_field_first = !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST);
288 
289  if (enc->id == AV_CODEC_ID_MJPEG)
290  enc_ctx->field_order = top_field_first ? AV_FIELD_TT : AV_FIELD_BB;
291  else
292  enc_ctx->field_order = top_field_first ? AV_FIELD_TB : AV_FIELD_BT;
293  } else
295 
296  break;
297  }
299  enc_ctx->time_base = AV_TIME_BASE_Q;
300 
301  if (!enc_ctx->width) {
302  enc_ctx->width = ost->ist->par->width;
303  enc_ctx->height = ost->ist->par->height;
304  }
305 
306  av_assert0(dec);
307  if (dec->subtitle_header) {
308  /* ASS code assumes this buffer is null terminated so add extra byte. */
309  enc_ctx->subtitle_header = av_mallocz(dec->subtitle_header_size + 1);
310  if (!enc_ctx->subtitle_header)
311  return AVERROR(ENOMEM);
312  memcpy(enc_ctx->subtitle_header, dec->subtitle_header,
313  dec->subtitle_header_size);
315  }
316 
317  break;
318  default:
319  av_assert0(0);
320  break;
321  }
322 
323  if (ost->bitexact)
324  enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
325 
327  enc_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
328 
330 
331  ret = hw_device_setup_for_encode(e, enc_ctx, frame ? frame->hw_frames_ctx : NULL);
332  if (ret < 0) {
333  av_log(e, AV_LOG_ERROR,
334  "Encoding hardware device setup failed: %s\n", av_err2str(ret));
335  return ret;
336  }
337 
338  if ((ret = avcodec_open2(enc_ctx, enc, NULL)) < 0) {
339  if (ret != AVERROR_EXPERIMENTAL)
340  av_log(e, AV_LOG_ERROR, "Error while opening encoder - maybe "
341  "incorrect parameters such as bit_rate, rate, width or height.\n");
342  return ret;
343  }
344 
345  ep->opened = 1;
346 
347  if (enc_ctx->frame_size)
348  frame_samples = enc_ctx->frame_size;
349 
350  if (enc_ctx->bit_rate && enc_ctx->bit_rate < 1000 &&
351  enc_ctx->codec_id != AV_CODEC_ID_CODEC2 /* don't complain about 700 bit/s modes */)
352  av_log(e, AV_LOG_WARNING, "The bitrate parameter is set too low."
353  " It takes bits/s as argument, not kbits/s\n");
354 
355  ret = of_stream_init(of, ost, enc_ctx);
356  if (ret < 0)
357  return ret;
358 
359  return frame_samples;
360 }
361 
363 {
364  OutputFile *of = ost->file;
365 
366  if (of->recording_time != INT64_MAX &&
367  av_compare_ts(ts, tb, of->recording_time, AV_TIME_BASE_Q) >= 0) {
368  return 0;
369  }
370  return 1;
371 }
372 
373 static int do_subtitle_out(OutputFile *of, OutputStream *ost, const AVSubtitle *sub,
374  AVPacket *pkt)
375 {
376  Encoder *e = ost->enc;
377  EncoderPriv *ep = ep_from_enc(e);
378  int subtitle_out_max_size = 1024 * 1024;
379  int subtitle_out_size, nb, i, ret;
380  AVCodecContext *enc;
381  int64_t pts;
382 
383  if (sub->pts == AV_NOPTS_VALUE) {
384  av_log(e, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
385  return exit_on_error ? AVERROR(EINVAL) : 0;
386  }
387  if ((of->start_time != AV_NOPTS_VALUE && sub->pts < of->start_time))
388  return 0;
389 
390  enc = e->enc_ctx;
391 
392  /* Note: DVB subtitle need one packet to draw them and one other
393  packet to clear them */
394  /* XXX: signal it in the codec context ? */
396  nb = 2;
397  else if (enc->codec_id == AV_CODEC_ID_ASS)
398  nb = FFMAX(sub->num_rects, 1);
399  else
400  nb = 1;
401 
402  /* shift timestamp to honor -ss and make check_recording_time() work with -t */
403  pts = sub->pts;
404  if (of->start_time != AV_NOPTS_VALUE)
405  pts -= of->start_time;
406  for (i = 0; i < nb; i++) {
407  AVSubtitle local_sub = *sub;
408 
410  return AVERROR_EOF;
411 
412  ret = av_new_packet(pkt, subtitle_out_max_size);
413  if (ret < 0)
414  return AVERROR(ENOMEM);
415 
416  local_sub.pts = pts;
417  // start_display_time is required to be 0
418  local_sub.pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
419  local_sub.end_display_time -= sub->start_display_time;
420  local_sub.start_display_time = 0;
421 
422  if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE && i == 1)
423  local_sub.num_rects = 0;
424  else if (enc->codec_id == AV_CODEC_ID_ASS && sub->num_rects > 0) {
425  local_sub.num_rects = 1;
426  local_sub.rects += i;
427  }
428 
429  e->frames_encoded++;
430 
431  subtitle_out_size = avcodec_encode_subtitle(enc, pkt->data, pkt->size, &local_sub);
432  if (subtitle_out_size < 0) {
433  av_log(e, AV_LOG_FATAL, "Subtitle encoding failed\n");
434  return subtitle_out_size;
435  }
436 
437  av_shrink_packet(pkt, subtitle_out_size);
439  pkt->pts = sub->pts;
441  if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
442  /* XXX: the pts correction is handled here. Maybe handling
443  it in the codec would be better */
444  if (i == 0)
445  pkt->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, pkt->time_base);
446  else
447  pkt->pts += av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, pkt->time_base);
448  }
449  pkt->dts = pkt->pts;
450 
451  ret = sch_enc_send(ep->sch, ep->sch_idx, pkt);
452  if (ret < 0) {
454  return ret;
455  }
456  }
457 
458  return 0;
459 }
460 
462  const AVFrame *frame, const AVPacket *pkt,
463  uint64_t frame_num)
464 {
465  Encoder *e = ost->enc;
466  EncoderPriv *ep = ep_from_enc(e);
467  AVIOContext *io = es->io;
468  AVRational tb = frame ? frame->time_base : pkt->time_base;
469  int64_t pts = frame ? frame->pts : pkt->pts;
470 
471  AVRational tbi = (AVRational){ 0, 1};
472  int64_t ptsi = INT64_MAX;
473 
474  const FrameData *fd = NULL;
475 
476  if (frame ? frame->opaque_ref : pkt->opaque_ref) {
477  fd = (const FrameData*)(frame ? frame->opaque_ref->data : pkt->opaque_ref->data);
478  tbi = fd->dec.tb;
479  ptsi = fd->dec.pts;
480  }
481 
482  pthread_mutex_lock(&es->lock);
483 
484  for (size_t i = 0; i < es->nb_components; i++) {
485  const EncStatsComponent *c = &es->components[i];
486 
487  switch (c->type) {
488  case ENC_STATS_LITERAL: avio_write (io, c->str, c->str_len); continue;
489  case ENC_STATS_FILE_IDX: avio_printf(io, "%d", ost->file->index); continue;
490  case ENC_STATS_STREAM_IDX: avio_printf(io, "%d", ost->index); continue;
491  case ENC_STATS_TIMEBASE: avio_printf(io, "%d/%d", tb.num, tb.den); continue;
492  case ENC_STATS_TIMEBASE_IN: avio_printf(io, "%d/%d", tbi.num, tbi.den); continue;
493  case ENC_STATS_PTS: avio_printf(io, "%"PRId64, pts); continue;
494  case ENC_STATS_PTS_IN: avio_printf(io, "%"PRId64, ptsi); continue;
495  case ENC_STATS_PTS_TIME: avio_printf(io, "%g", pts * av_q2d(tb)); continue;
496  case ENC_STATS_PTS_TIME_IN: avio_printf(io, "%g", ptsi == INT64_MAX ?
497  INFINITY : ptsi * av_q2d(tbi)); continue;
498  case ENC_STATS_FRAME_NUM: avio_printf(io, "%"PRIu64, frame_num); continue;
499  case ENC_STATS_FRAME_NUM_IN: avio_printf(io, "%"PRIu64, fd ? fd->dec.frame_num : -1); continue;
500  }
501 
502  if (frame) {
503  switch (c->type) {
504  case ENC_STATS_SAMPLE_NUM: avio_printf(io, "%"PRIu64, e->samples_encoded); continue;
505  case ENC_STATS_NB_SAMPLES: avio_printf(io, "%d", frame->nb_samples); continue;
506  default: av_assert0(0);
507  }
508  } else {
509  switch (c->type) {
510  case ENC_STATS_DTS: avio_printf(io, "%"PRId64, pkt->dts); continue;
511  case ENC_STATS_DTS_TIME: avio_printf(io, "%g", pkt->dts * av_q2d(tb)); continue;
512  case ENC_STATS_PKT_SIZE: avio_printf(io, "%d", pkt->size); continue;
514  "K" : "N", 1); continue;
515  case ENC_STATS_BITRATE: {
516  double duration = FFMAX(pkt->duration, 1) * av_q2d(tb);
517  avio_printf(io, "%g", 8.0 * pkt->size / duration);
518  continue;
519  }
520  case ENC_STATS_AVG_BITRATE: {
521  double duration = pkt->dts * av_q2d(tb);
522  avio_printf(io, "%g", duration > 0 ? 8.0 * ep->data_size / duration : -1.);
523  continue;
524  }
525  default: av_assert0(0);
526  }
527  }
528  }
529  avio_w8(io, '\n');
530  avio_flush(io);
531 
533 }
534 
535 static inline double psnr(double d)
536 {
537  return -10.0 * log10(d);
538 }
539 
540 static int update_video_stats(OutputStream *ost, const AVPacket *pkt, int write_vstats)
541 {
542  Encoder *e = ost->enc;
543  EncoderPriv *ep = ep_from_enc(e);
545  NULL);
546  AVCodecContext *enc = e->enc_ctx;
547  enum AVPictureType pict_type;
548  int64_t frame_number;
549  double ti1, bitrate, avg_bitrate;
550  double psnr_val = -1;
551  int quality;
552 
553  quality = sd ? AV_RL32(sd) : -1;
554  pict_type = sd ? sd[4] : AV_PICTURE_TYPE_NONE;
555 
556  atomic_store(&ost->quality, quality);
557 
558  if ((enc->flags & AV_CODEC_FLAG_PSNR) && sd && sd[5]) {
559  // FIXME the scaling assumes 8bit
560  double error = AV_RL64(sd + 8) / (enc->width * enc->height * 255.0 * 255.0);
561  if (error >= 0 && error <= 1)
562  psnr_val = psnr(error);
563  }
564 
565  if (!write_vstats)
566  return 0;
567 
568  /* this is executed just the first time update_video_stats is called */
569  if (!vstats_file) {
570  vstats_file = fopen(vstats_filename, "w");
571  if (!vstats_file) {
572  perror("fopen");
573  return AVERROR(errno);
574  }
575  }
576 
577  frame_number = ep->packets_encoded;
578  if (vstats_version <= 1) {
579  fprintf(vstats_file, "frame= %5"PRId64" q= %2.1f ", frame_number,
580  quality / (float)FF_QP2LAMBDA);
581  } else {
582  fprintf(vstats_file, "out= %2d st= %2d frame= %5"PRId64" q= %2.1f ",
583  ost->file->index, ost->index, frame_number,
584  quality / (float)FF_QP2LAMBDA);
585  }
586 
587  if (psnr_val >= 0)
588  fprintf(vstats_file, "PSNR= %6.2f ", psnr_val);
589 
590  fprintf(vstats_file,"f_size= %6d ", pkt->size);
591  /* compute pts value */
592  ti1 = pkt->dts * av_q2d(pkt->time_base);
593  if (ti1 < 0.01)
594  ti1 = 0.01;
595 
596  bitrate = (pkt->size * 8) / av_q2d(enc->time_base) / 1000.0;
597  avg_bitrate = (double)(ep->data_size * 8) / ti1 / 1000.0;
598  fprintf(vstats_file, "s_size= %8.0fKiB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
599  (double)ep->data_size / 1024, ti1, bitrate, avg_bitrate);
600  fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(pict_type));
601 
602  return 0;
603 }
604 
606  AVPacket *pkt)
607 {
608  Encoder *e = ost->enc;
609  EncoderPriv *ep = ep_from_enc(e);
610  AVCodecContext *enc = e->enc_ctx;
611  const char *type_desc = av_get_media_type_string(enc->codec_type);
612  const char *action = frame ? "encode" : "flush";
613  int ret;
614 
615  if (frame) {
616  FrameData *fd = frame_data(frame);
617 
618  if (!fd)
619  return AVERROR(ENOMEM);
620 
622 
623  if (ost->enc_stats_pre.io)
624  enc_stats_write(ost, &ost->enc_stats_pre, frame, NULL,
625  e->frames_encoded);
626 
627  e->frames_encoded++;
628  e->samples_encoded += frame->nb_samples;
629 
630  if (debug_ts) {
631  av_log(e, AV_LOG_INFO, "encoder <- type:%s "
632  "frame_pts:%s frame_pts_time:%s time_base:%d/%d\n",
633  type_desc,
634  av_ts2str(frame->pts), av_ts2timestr(frame->pts, &enc->time_base),
635  enc->time_base.num, enc->time_base.den);
636  }
637 
638  if (frame->sample_aspect_ratio.num && !ost->frame_aspect_ratio.num)
639  enc->sample_aspect_ratio = frame->sample_aspect_ratio;
640  }
641 
643 
644  ret = avcodec_send_frame(enc, frame);
645  if (ret < 0 && !(ret == AVERROR_EOF && !frame)) {
646  av_log(e, AV_LOG_ERROR, "Error submitting %s frame to the encoder\n",
647  type_desc);
648  return ret;
649  }
650 
651  while (1) {
652  FrameData *fd;
653 
655 
657  update_benchmark("%s_%s %d.%d", action, type_desc,
658  of->index, ost->index);
659 
660  pkt->time_base = enc->time_base;
661 
662  /* if two pass, output log on success and EOF */
663  if ((ret >= 0 || ret == AVERROR_EOF) && ost->logfile && enc->stats_out)
664  fprintf(ost->logfile, "%s", enc->stats_out);
665 
666  if (ret == AVERROR(EAGAIN)) {
667  av_assert0(frame); // should never happen during flushing
668  return 0;
669  } else if (ret < 0) {
670  if (ret != AVERROR_EOF)
671  av_log(e, AV_LOG_ERROR, "%s encoding failed\n", type_desc);
672  return ret;
673  }
674 
675  fd = packet_data(pkt);
676  if (!fd)
677  return AVERROR(ENOMEM);
679 
680  // attach stream parameters to first packet if requested
682  if (ep->attach_par && !ep->packets_encoded) {
684  if (!fd->par_enc)
685  return AVERROR(ENOMEM);
686 
688  if (ret < 0)
689  return ret;
690  }
691 
693 
694  if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
696  if (ret < 0)
697  return ret;
698  }
699 
700  if (ost->enc_stats_post.io)
701  enc_stats_write(ost, &ost->enc_stats_post, NULL, pkt,
702  ep->packets_encoded);
703 
704  if (debug_ts) {
705  av_log(e, AV_LOG_INFO, "encoder -> type:%s "
706  "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s "
707  "duration:%s duration_time:%s\n",
708  type_desc,
712  }
713 
714  ep->data_size += pkt->size;
715 
716  ep->packets_encoded++;
717 
718  ret = sch_enc_send(ep->sch, ep->sch_idx, pkt);
719  if (ret < 0) {
721  return ret;
722  }
723  }
724 
725  av_unreachable("encode_frame() loop should return");
726 }
727 
728 static enum AVPictureType forced_kf_apply(void *logctx, KeyframeForceCtx *kf,
729  const AVFrame *frame)
730 {
731  double pts_time;
732 
733  if (kf->ref_pts == AV_NOPTS_VALUE)
734  kf->ref_pts = frame->pts;
735 
736  pts_time = (frame->pts - kf->ref_pts) * av_q2d(frame->time_base);
737  if (kf->index < kf->nb_pts &&
738  av_compare_ts(frame->pts, frame->time_base, kf->pts[kf->index], AV_TIME_BASE_Q) >= 0) {
739  kf->index++;
740  goto force_keyframe;
741  } else if (kf->pexpr) {
742  double res;
743  kf->expr_const_values[FKF_T] = pts_time;
744  res = av_expr_eval(kf->pexpr,
745  kf->expr_const_values, NULL);
746  av_log(logctx, AV_LOG_TRACE,
747  "force_key_frame: n:%f n_forced:%f prev_forced_n:%f t:%f prev_forced_t:%f -> res:%f\n",
753  res);
754 
755  kf->expr_const_values[FKF_N] += 1;
756 
757  if (res) {
761  goto force_keyframe;
762  }
763  } else if (kf->type == KF_FORCE_SOURCE && (frame->flags & AV_FRAME_FLAG_KEY)) {
764  goto force_keyframe;
765  } else if (kf->type == KF_FORCE_SCD_METADATA &&
766  av_dict_get(frame->metadata, "lavfi.scd.time", NULL, 0)) {
767  goto force_keyframe;
768  }
769 
770  return AV_PICTURE_TYPE_NONE;
771 
772 force_keyframe:
773  av_log(logctx, AV_LOG_DEBUG, "Forced keyframe at time %f\n", pts_time);
774  return AV_PICTURE_TYPE_I;
775 }
776 
778 {
779  Encoder *e = ost->enc;
780  OutputFile *of = ost->file;
781  enum AVMediaType type = ost->type;
782 
783  if (type == AVMEDIA_TYPE_SUBTITLE) {
784  const AVSubtitle *subtitle = frame && frame->buf[0] ?
785  (AVSubtitle*)frame->buf[0]->data : NULL;
786 
787  // no flushing for subtitles
788  return subtitle && subtitle->num_rects ?
789  do_subtitle_out(of, ost, subtitle, pkt) : 0;
790  }
791 
792  if (frame) {
793  if (!check_recording_time(ost, frame->pts, frame->time_base))
794  return AVERROR_EOF;
795 
796  if (type == AVMEDIA_TYPE_VIDEO) {
797  frame->quality = e->enc_ctx->global_quality;
798  frame->pict_type = forced_kf_apply(e, &ost->kf, frame);
799  } else {
801  e->enc_ctx->ch_layout.nb_channels != frame->ch_layout.nb_channels) {
802  av_log(e, AV_LOG_ERROR,
803  "Audio channel count changed and encoder does not support parameter changes\n");
804  return 0;
805  }
806  }
807  }
808 
809  return encode_frame(of, ost, frame, pkt);
810 }
811 
813 {
814  char name[16];
815  snprintf(name, sizeof(name), "enc%d:%d:%s", ost->file->index, ost->index,
816  ost->enc->enc_ctx->codec->name);
818 }
819 
821 {
822  av_packet_free(&et->pkt);
823  av_frame_free(&et->frame);
824 
825  memset(et, 0, sizeof(*et));
826 }
827 
829 {
830  memset(et, 0, sizeof(*et));
831 
832  et->frame = av_frame_alloc();
833  if (!et->frame)
834  goto fail;
835 
836  et->pkt = av_packet_alloc();
837  if (!et->pkt)
838  goto fail;
839 
840  return 0;
841 
842 fail:
843  enc_thread_uninit(et);
844  return AVERROR(ENOMEM);
845 }
846 
847 int encoder_thread(void *arg)
848 {
849  OutputStream *ost = arg;
850  Encoder *e = ost->enc;
851  EncoderPriv *ep = ep_from_enc(e);
852  EncoderThread et;
853  int ret = 0, input_status = 0;
854  int name_set = 0;
855 
856  ret = enc_thread_init(&et);
857  if (ret < 0)
858  goto finish;
859 
860  /* Open the subtitle encoders immediately. AVFrame-based encoders
861  * are opened through a callback from the scheduler once they get
862  * their first frame
863  *
864  * N.B.: because the callback is called from a different thread,
865  * enc_ctx MUST NOT be accessed before sch_enc_receive() returns
866  * for the first time for audio/video. */
867  if (ost->type != AVMEDIA_TYPE_VIDEO && ost->type != AVMEDIA_TYPE_AUDIO) {
868  ret = enc_open(ost, NULL);
869  if (ret < 0)
870  goto finish;
871  }
872 
873  while (!input_status) {
874  input_status = sch_enc_receive(ep->sch, ep->sch_idx, et.frame);
875  if (input_status < 0) {
876  if (input_status == AVERROR_EOF) {
877  av_log(e, AV_LOG_VERBOSE, "Encoder thread received EOF\n");
878  if (ep->opened)
879  break;
880 
881  av_log(e, AV_LOG_ERROR, "Could not open encoder before EOF\n");
882  ret = AVERROR(EINVAL);
883  } else {
884  av_log(e, AV_LOG_ERROR, "Error receiving a frame for encoding: %s\n",
885  av_err2str(ret));
886  ret = input_status;
887  }
888  goto finish;
889  }
890 
891  if (!name_set) {
893  name_set = 1;
894  }
895 
896  ret = frame_encode(ost, et.frame, et.pkt);
897 
898  av_packet_unref(et.pkt);
899  av_frame_unref(et.frame);
900 
901  if (ret < 0) {
902  if (ret == AVERROR_EOF)
903  av_log(e, AV_LOG_VERBOSE, "Encoder returned EOF, finishing\n");
904  else
905  av_log(e, AV_LOG_ERROR, "Error encoding a frame: %s\n",
906  av_err2str(ret));
907  break;
908  }
909  }
910 
911  // flush the encoder
912  if (ret == 0 || ret == AVERROR_EOF) {
913  ret = frame_encode(ost, NULL, et.pkt);
914  if (ret < 0 && ret != AVERROR_EOF)
915  av_log(e, AV_LOG_ERROR, "Error flushing encoder: %s\n",
916  av_err2str(ret));
917  }
918 
919  // EOF is normal thread termination
920  if (ret == AVERROR_EOF)
921  ret = 0;
922 
923 finish:
924  enc_thread_uninit(&et);
925 
926  return ret;
927 }
928 
930 {
931  EncoderPriv *ep = ep_from_enc(enc);
932  ep->attach_par = 1;
933  return ep->sch_idx;
934 }
frame_samples
static int frame_samples(const SyncQueue *sq, SyncQueueFrame frame)
Definition: sync_queue.c:131
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
AVSubtitle
Definition: avcodec.h:2087
KeyframeForceCtx::pts
int64_t * pts
Definition: ffmpeg.h:594
avcodec_encode_subtitle
int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, const AVSubtitle *sub)
Definition: encode.c:203
AVCodecContext::frame_size
int frame_size
Number of samples per channel in an audio frame.
Definition: avcodec.h:1068
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:434
FrameData::par_enc
AVCodecParameters * par_enc
Definition: ffmpeg.h:709
AVCodec
AVCodec.
Definition: codec.h:169
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
AVERROR_EXPERIMENTAL
#define AVERROR_EXPERIMENTAL
Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
Definition: error.h:74
INFINITY
#define INFINITY
Definition: mathematics.h:118
FKF_PREV_FORCED_T
@ FKF_PREV_FORCED_T
Definition: ffmpeg.h:535
atomic_store
#define atomic_store(object, desired)
Definition: stdatomic.h:85
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1937
avcodec_receive_packet
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
Definition: encode.c:577
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVSubtitle::rects
AVSubtitleRect ** rects
Definition: avcodec.h:2092
FrameData::nb_side_data
int nb_side_data
Definition: ffmpeg.h:712
Encoder::samples_encoded
uint64_t samples_encoded
Definition: ffmpeg.h:611
av_compare_ts
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
Definition: mathematics.c:147
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:671
KF_FORCE_SCD_METADATA
@ KF_FORCE_SCD_METADATA
Definition: ffmpeg.h:585
FrameData
Definition: ffmpeg.h:690
AVCodecContext::decoded_side_data
AVFrameSideData ** decoded_side_data
Array containing static side data, such as HDR10 CLL / MDCV structures.
Definition: avcodec.h:1929
ENC_STATS_PTS
@ ENC_STATS_PTS
Definition: ffmpeg.h:551
ENC_STATS_FRAME_NUM_IN
@ ENC_STATS_FRAME_NUM_IN
Definition: ffmpeg.h:548
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1040
FKF_PREV_FORCED_N
@ FKF_PREV_FORCED_N
Definition: ffmpeg.h:534
AV_PKT_DATA_QUALITY_STATS
@ AV_PKT_DATA_QUALITY_STATS
This side data contains quality related information from the encoder.
Definition: packet.h:129
clone_side_data
static int clone_side_data(AVFrameSideData ***dst, int *nb_dst, AVFrameSideData *const *src, int nb_src, unsigned int flags)
Wrapper calling av_frame_side_data_clone() in a loop for all source entries.
Definition: ffmpeg_utils.h:50
AV_RL64
uint64_t_TMPL AV_RL64
Definition: bytestream.h:91
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
ENC_STATS_DTS
@ ENC_STATS_DTS
Definition: ffmpeg.h:555
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:213
AVPictureType
AVPictureType
Definition: avutil.h:276
KeyframeForceCtx::nb_pts
int nb_pts
Definition: ffmpeg.h:595
rational.h
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
AVSubtitle::num_rects
unsigned num_rects
Definition: avcodec.h:2091
ENC_STATS_AVG_BITRATE
@ ENC_STATS_AVG_BITRATE
Definition: ffmpeg.h:561
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
OutputFile::start_time
int64_t start_time
start time in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:684
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:466
pixdesc.h
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:664
AVCodec::capabilities
int capabilities
Codec capabilities.
Definition: codec.h:188
FKF_T
@ FKF_T
Definition: ffmpeg.h:536
AVPacket::data
uint8_t * data
Definition: packet.h:603
ENC_STATS_LITERAL
@ ENC_STATS_LITERAL
Definition: ffmpeg.h:544
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
AVCodecContext::field_order
enum AVFieldOrder field_order
Field order.
Definition: avcodec.h:694
pthread_mutex_lock
static av_always_inline int pthread_mutex_lock(pthread_mutex_t *mutex)
Definition: os2threads.h:119
KeyframeForceCtx::type
int type
Definition: ffmpeg.h:589
AVCodecContext::subtitle_header
uint8_t * subtitle_header
Definition: avcodec.h:1744
forced_kf_apply
static enum AVPictureType forced_kf_apply(void *logctx, KeyframeForceCtx *kf, const AVFrame *frame)
Definition: ffmpeg_enc.c:728
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:621
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AV_CODEC_FLAG_PSNR
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
Definition: avcodec.h:306
HWDevice
Definition: ffmpeg.h:97
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
LATENCY_PROBE_ENC_POST
@ LATENCY_PROBE_ENC_POST
Definition: ffmpeg.h:93
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
AV_CODEC_FLAG_INTERLACED_ME
#define AV_CODEC_FLAG_INTERLACED_ME
interlaced motion estimation
Definition: avcodec.h:331
psnr
static double psnr(double d)
Definition: ffmpeg_enc.c:535
ost
static AVStream * ost
Definition: vaapi_transcode.c:42
tf_sess_config.config
config
Definition: tf_sess_config.py:33
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:650
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:74
av_chroma_location_name
const char * av_chroma_location_name(enum AVChromaLocation location)
Definition: pixdesc.c:3877
quality
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
Definition: rate_distortion.txt:12
encode_frame
static int encode_frame(OutputFile *of, OutputStream *ost, AVFrame *frame, AVPacket *pkt)
Definition: ffmpeg_enc.c:605
ENC_STATS_TIMEBASE_IN
@ ENC_STATS_TIMEBASE_IN
Definition: ffmpeg.h:550
AV_FIELD_BT
@ AV_FIELD_BT
Bottom coded first, top displayed first.
Definition: defs.h:217
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:694
FrameData::frame_num
uint64_t frame_num
Definition: ffmpeg.h:697
InputStream
Definition: ffmpeg.h:461
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:563
debug_ts
int debug_ts
Definition: ffmpeg_opt.c:67
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:214
AV_CODEC_ID_ASS
@ AV_CODEC_ID_ASS
Definition: codec_id.h:587
AV_CODEC_FLAG_COPY_OPAQUE
#define AV_CODEC_FLAG_COPY_OPAQUE
Definition: avcodec.h:279
finish
static void finish(void)
Definition: movenc.c:374
EncoderPriv::log_name
char log_name[32]
Definition: ffmpeg_enc.c:45
vstats_version
int vstats_version
Definition: ffmpeg_opt.c:76
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:452
AVPacket::opaque_ref
AVBufferRef * opaque_ref
AVBufferRef for free use by the API user.
Definition: packet.h:639
FrameData::dec
struct FrameData::@6 dec
AV_CODEC_FLAG_FRAME_DURATION
#define AV_CODEC_FLAG_FRAME_DURATION
Signal to the encoder that the values of AVFrame.duration are valid and should be used (typically for...
Definition: avcodec.h:286
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1055
av_shrink_packet
void av_shrink_packet(AVPacket *pkt, int size)
Reduce packet size, correctly zeroing padding.
Definition: packet.c:113
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:500
KeyframeForceCtx::ref_pts
int64_t ref_pts
Definition: ffmpeg.h:591
update_benchmark
void update_benchmark(const char *fmt,...)
Definition: ffmpeg.c:551
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
pts
static int64_t pts
Definition: transcode_aac.c:649
FrameData::tb
AVRational tb
Definition: ffmpeg.h:700
EncoderPriv::packets_encoded
uint64_t packets_encoded
Definition: ffmpeg_enc.c:51
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_FIELD_TB
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition: defs.h:216
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:310
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:566
enc_thread_uninit
static void enc_thread_uninit(EncoderThread *et)
Definition: ffmpeg_enc.c:820
avassert.h
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:657
FrameData::frame_rate_filter
AVRational frame_rate_filter
Definition: ffmpeg.h:703
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AV_FRAME_SIDE_DATA_FLAG_UNIQUE
#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE
Remove existing entries before adding new ones.
Definition: frame.h:1087
encoder_thread
int encoder_thread(void *arg)
Definition: ffmpeg_enc.c:847
ENC_STATS_PTS_IN
@ ENC_STATS_PTS_IN
Definition: ffmpeg.h:553
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:681
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
EncStats::components
EncStatsComponent * components
Definition: ffmpeg.h:573
avcodec_alloc_context3
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
Definition: options.c:149
enc_class
static const AVClass enc_class
Definition: ffmpeg_enc.c:92
intreadwrite.h
AVCodecContext::stats_in
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
Definition: avcodec.h:1338
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:98
AVCodecContext::global_quality
int global_quality
Global quality for codecs which cannot change it per frame.
Definition: avcodec.h:1235
vstats_filename
char * vstats_filename
Definition: ffmpeg_opt.c:54
EncoderPriv::attach_par
int attach_par
Definition: ffmpeg_enc.c:54
pthread_mutex_unlock
static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
Definition: os2threads.h:126
Encoder::class
const AVClass * class
Definition: ffmpeg.h:605
AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
The codec supports this format via the hw_frames_ctx interface.
Definition: codec.h:289
AVCodecContext::nb_decoded_side_data
int nb_decoded_side_data
Definition: avcodec.h:1930
bitrate
int64_t bitrate
Definition: av1_levels.c:47
ENC_STATS_FILE_IDX
@ ENC_STATS_FILE_IDX
Definition: ffmpeg.h:545
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
enc_item_name
static const char * enc_item_name(void *obj)
Definition: ffmpeg_enc.c:85
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:141
ENC_STATS_BITRATE
@ ENC_STATS_BITRATE
Definition: ffmpeg.h:560
Encoder::frames_encoded
uint64_t frames_encoded
Definition: ffmpeg.h:610
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
LATENCY_PROBE_ENC_PRE
@ LATENCY_PROBE_ENC_PRE
Definition: ffmpeg.h:92
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1571
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
enc_stats_write
void enc_stats_write(OutputStream *ost, EncStats *es, const AVFrame *frame, const AVPacket *pkt, uint64_t frame_num)
Definition: ffmpeg_enc.c:461
av_expr_eval
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:824
EncoderPriv::sch_idx
unsigned sch_idx
Definition: ffmpeg_enc.c:57
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
KF_FORCE_SOURCE
@ KF_FORCE_SOURCE
Definition: ffmpeg.h:583
AVSubtitle::pts
int64_t pts
Same as packet pts, in AV_TIME_BASE.
Definition: avcodec.h:2093
Encoder::enc_ctx
AVCodecContext * enc_ctx
Definition: ffmpeg.h:607
av_hwdevice_get_type_name
const char * av_hwdevice_get_type_name(enum AVHWDeviceType type)
Get the string name of an AVHWDeviceType.
Definition: hwcontext.c:120
AV_CODEC_ID_CODEC2
@ AV_CODEC_ID_CODEC2
Definition: codec_id.h:519
sch_enc_receive
int sch_enc_receive(Scheduler *sch, unsigned enc_idx, AVFrame *frame)
Called by encoder tasks to obtain frames for encoding.
Definition: ffmpeg_sched.c:2511
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:453
arg
const char * arg
Definition: jacosubdec.c:65
KeyframeForceCtx::expr_const_values
double expr_const_values[FKF_NB]
Definition: ffmpeg.h:599
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:228
fail
#define fail
Definition: test.h:478
ENC_STATS_KEYFRAME
@ ENC_STATS_KEYFRAME
Definition: ffmpeg.h:562
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
ep_from_enc
static EncoderPriv * ep_from_enc(Encoder *enc)
Definition: ffmpeg_enc.c:60
NULL
#define NULL
Definition: coverity.c:32
frame_encode
static int frame_encode(OutputStream *ost, AVFrame *frame, AVPacket *pkt)
Definition: ffmpeg_enc.c:777
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:681
AVCodec::type
enum AVMediaType type
Definition: codec.h:182
Decoder
Definition: ffmpeg.h:447
ENC_STATS_PTS_TIME
@ ENC_STATS_PTS_TIME
Definition: ffmpeg.h:552
avcodec_free_context
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
Definition: options.c:164
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_unreachable
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition: avassert.h:116
EncStats::lock
pthread_mutex_t lock
Definition: ffmpeg.h:578
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:493
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
AVCodecContext::subtitle_header_size
int subtitle_header_size
Header containing style information for text subtitles.
Definition: avcodec.h:1743
EncStats
Definition: ffmpeg.h:572
vstats_file
FILE * vstats_file
Definition: ffmpeg.c:92
FrameData::wallclock
int64_t wallclock[LATENCY_PROBE_NB]
Definition: ffmpeg.h:707
AV_CODEC_CAP_VARIABLE_FRAME_SIZE
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE
Audio encoder supports receiving a different number of samples in each call.
Definition: codec.h:110
double
double
Definition: af_crystalizer.c:132
of_stream_init
int of_stream_init(OutputFile *of, OutputStream *ost, const AVCodecContext *enc_ctx)
Definition: ffmpeg_mux.c:606
avcodec_open2
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
Definition: avcodec.c:144
time.h
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:184
OutputFile::index
int index
Definition: ffmpeg.h:676
EncoderThread::pkt
AVPacket * pkt
Definition: ffmpeg_enc.c:68
ENC_STATS_PTS_TIME_IN
@ ENC_STATS_PTS_TIME_IN
Definition: ffmpeg.h:554
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
sch_enc_send
int sch_enc_send(Scheduler *sch, unsigned enc_idx, AVPacket *pkt)
Called by encoder tasks to send encoded packets downstream.
Definition: ffmpeg_sched.c:2555
enc_loopback
int enc_loopback(Encoder *enc)
Definition: ffmpeg_enc.c:929
Scheduler
Definition: ffmpeg_sched.c:278
enc_thread_init
static int enc_thread_init(EncoderThread *et)
Definition: ffmpeg_enc.c:828
AVCodecContext::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avcodec.h:547
AVCodecContext::stats_out
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:1330
eval.h
FrameData::side_data
AVFrameSideData ** side_data
Definition: ffmpeg.h:711
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVCodecContext::flags2
int flags2
AV_CODEC_FLAG2_*.
Definition: avcodec.h:507
av_ts2timestr
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:83
AVMediaType
AVMediaType
Definition: avutil.h:198
AVPacket::size
int size
Definition: packet.h:604
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
EncoderPriv::sch
Scheduler * sch
Definition: ffmpeg_enc.c:56
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1047
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
ENC_STATS_NB_SAMPLES
@ ENC_STATS_NB_SAMPLES
Definition: ffmpeg.h:558
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
hw_device_setup_for_encode
static int hw_device_setup_for_encode(Encoder *e, AVCodecContext *enc_ctx, AVBufferRef *frames_ref)
Definition: ffmpeg_enc.c:133
HWDevice::device_ref
AVBufferRef * device_ref
Definition: ffmpeg.h:100
hw_device_get_by_type
HWDevice * hw_device_get_by_type(enum AVHWDeviceType type)
Definition: ffmpeg_hw.c:28
AVCHROMA_LOC_UNSPECIFIED
@ AVCHROMA_LOC_UNSPECIFIED
Definition: pixfmt.h:797
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:277
frame_data
FrameData * frame_data(AVFrame *frame)
Get our axiliary frame data attached to the frame, allocating it if needed.
Definition: ffmpeg.c:477
AVSubtitle::end_display_time
uint32_t end_display_time
Definition: avcodec.h:2090
frame.h
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:602
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:206
EncoderPriv::data_size
uint64_t data_size
Definition: ffmpeg_enc.c:48
FrameData::pts
int64_t pts
Definition: ffmpeg.h:699
EncoderPriv::opened
int opened
Definition: ffmpeg_enc.c:53
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:609
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:63
Encoder
Definition: ffmpeg.h:604
AVCodecParameters::avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:57
ENC_STATS_FRAME_NUM
@ ENC_STATS_FRAME_NUM
Definition: ffmpeg.h:547
KeyframeForceCtx
Definition: ffmpeg.h:588
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AVCodec::id
enum AVCodecID id
Definition: codec.h:183
enc_thread_set_name
static void enc_thread_set_name(const OutputStream *ost)
Definition: ffmpeg_enc.c:812
av_get_picture_type_char
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
Definition: utils.c:40
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:57
log.h
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:596
FrameData::bits_per_raw_sample
int bits_per_raw_sample
Definition: ffmpeg.h:705
av_get_bytes_per_sample
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:108
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: packet.c:252
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
The codec supports this format via the hw_device_ctx interface.
Definition: codec.h:276
display.h
AV_FIELD_BB
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition: defs.h:215
exit_on_error
int exit_on_error
Definition: ffmpeg_opt.c:68
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:176
AVCodecContext::hw_device_ctx
AVBufferRef * hw_device_ctx
A reference to the AVHWDeviceContext describing the device which will be used by a hardware encoder/d...
Definition: avcodec.h:1493
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:688
ENC_STATS_STREAM_IDX
@ ENC_STATS_STREAM_IDX
Definition: ffmpeg.h:546
AVCodecContext::height
int height
Definition: avcodec.h:604
avcodec_send_frame
int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Supply a raw video or audio frame to the encoder.
Definition: encode.c:544
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:643
ENC_STATS_SAMPLE_NUM
@ ENC_STATS_SAMPLE_NUM
Definition: ffmpeg.h:557
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:689
AVCodecContext::hw_frames_ctx
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
Definition: avcodec.h:1471
avcodec.h
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
InputStream::decoder
Decoder * decoder
Definition: ffmpeg.h:478
ret
ret
Definition: filter_design.txt:187
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:204
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
EncoderThread::frame
AVFrame * frame
Definition: ffmpeg_enc.c:67
EncoderPriv
Definition: ffmpeg_enc.c:41
dict.h
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
AVCodecParameters::avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **par)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:67
avio_printf
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
Writes a formatted string to the context.
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:28
AVCodecContext
main external API structure.
Definition: avcodec.h:443
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:753
HWDevice::name
const char * name
Definition: ffmpeg.h:98
enc_open
int enc_open(void *opaque, const AVFrame *frame)
Definition: ffmpeg_enc.c:184
AVRational::den
int den
Denominator.
Definition: rational.h:60
KeyframeForceCtx::index
int index
Definition: ffmpeg.h:596
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
EncoderPriv::e
Encoder e
Definition: ffmpeg_enc.c:42
do_subtitle_out
static int do_subtitle_out(OutputFile *of, OutputStream *ost, const AVSubtitle *sub, AVPacket *pkt)
Definition: ffmpeg_enc.c:373
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
Decoder::subtitle_header_size
int subtitle_header_size
Definition: ffmpeg.h:453
check_recording_time
static int check_recording_time(OutputStream *ost, int64_t ts, AVRational tb)
Definition: ffmpeg_enc.c:362
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
avcodec_get_hw_config
const AVCodecHWConfig * avcodec_get_hw_config(const AVCodec *codec, int index)
Retrieve supported hardware configurations for a codec.
Definition: utils.c:842
enc_free
void enc_free(Encoder **penc)
Definition: ffmpeg_enc.c:71
AV_CODEC_CAP_PARAM_CHANGE
#define AV_CODEC_CAP_PARAM_CHANGE
Codec supports changed parameters at any point.
Definition: codec.h:100
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:450
AVCodecContext::codec_type
enum AVMediaType codec_type
Definition: avcodec.h:451
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
avutil.h
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:322
enc_alloc
int enc_alloc(Encoder **penc, const AVCodec *codec, Scheduler *sch, unsigned sch_idx, void *log_parent)
Definition: ffmpeg_enc.c:99
AVCodecParameters::avcodec_parameters_from_context
int avcodec_parameters_from_context(struct AVCodecParameters *par, const AVCodecContext *codec)
Fill the parameters struct based on the values from the supplied codec context.
Definition: codec_par.c:138
KeyframeForceCtx::pexpr
AVExpr * pexpr
Definition: ffmpeg.h:598
FKF_N_FORCED
@ FKF_N_FORCED
Definition: ffmpeg.h:533
AVPacket
This structure stores compressed data.
Definition: packet.h:580
EncStatsComponent
Definition: ffmpeg.h:565
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
HWDevice::type
enum AVHWDeviceType type
Definition: ffmpeg.h:99
EncStats::nb_components
int nb_components
Definition: ffmpeg.h:574
packet_data
FrameData * packet_data(AVPacket *pkt)
Definition: ffmpeg.c:489
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:604
AV_CODEC_FLAG2_FIXED_FRAME_SIZE
#define AV_CODEC_FLAG2_FIXED_FRAME_SIZE
Force audio encoders to use a fixed frame size.
Definition: avcodec.h:359
ENC_STATS_PKT_SIZE
@ ENC_STATS_PKT_SIZE
Definition: ffmpeg.h:559
timestamp.h
OutputStream
Definition: mux.c:53
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
EncoderPriv::log_parent
void * log_parent
Definition: ffmpeg_enc.c:44
av_ts2str
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:54
AVCodecHWConfig
Definition: codec.h:308
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
avstring.h
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:226
FKF_N
@ FKF_N
Definition: ffmpeg.h:532
ENC_STATS_DTS_TIME
@ ENC_STATS_DTS_TIME
Definition: ffmpeg.h:556
OutputFile::recording_time
int64_t recording_time
desired length of the resulting file in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:683
AV_PKT_FLAG_TRUSTED
#define AV_PKT_FLAG_TRUSTED
The packet comes from a trusted source.
Definition: packet.h:664
snprintf
#define snprintf
Definition: snprintf.h:34
EncStats::io
AVIOContext * io
Definition: ffmpeg.h:576
update_video_stats
static int update_video_stats(OutputStream *ost, const AVPacket *pkt, int write_vstats)
Definition: ffmpeg_enc.c:540
Decoder::subtitle_header
uint8_t * subtitle_header
Definition: ffmpeg.h:452
AVCodecContext::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition: avcodec.h:628
AVSubtitle::start_display_time
uint32_t start_display_time
Definition: avcodec.h:2089
duration
static int64_t duration
Definition: ffplay.c:329
ENC_STATS_TIMEBASE
@ ENC_STATS_TIMEBASE
Definition: ffmpeg.h:549
AVPacket::time_base
AVRational time_base
Time base of the packet's timestamps.
Definition: packet.h:647
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376
EncoderThread
Definition: ffmpeg_enc.c:66
OutputFile
Definition: ffmpeg.h:673
ff_thread_setname
static int ff_thread_setname(const char *name)
Definition: thread.h:216