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 #include "ffmpeg_utils.h"
24 #include "thread_queue.h"
25 
26 #include "libavutil/avassert.h"
27 #include "libavutil/avstring.h"
28 #include "libavutil/avutil.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/display.h"
31 #include "libavutil/eval.h"
32 #include "libavutil/frame.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/log.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/rational.h"
37 #include "libavutil/time.h"
38 #include "libavutil/timestamp.h"
39 
40 #include "libavcodec/avcodec.h"
41 
42 #include "libavformat/avformat.h"
43 
44 struct Encoder {
45  // combined size of all the packets received from the encoder
46  uint64_t data_size;
47 
48  // number of packets received from the encoder
49  uint64_t packets_encoded;
50 
51  int opened;
53 
55  unsigned sch_idx;
56 };
57 
58 // data that is local to the decoder thread and not visible outside of it
59 typedef struct EncoderThread {
63 
64 void enc_free(Encoder **penc)
65 {
66  Encoder *enc = *penc;
67 
68  if (!enc)
69  return;
70 
71  av_freep(penc);
72 }
73 
74 int enc_alloc(Encoder **penc, const AVCodec *codec,
75  Scheduler *sch, unsigned sch_idx)
76 {
77  Encoder *enc;
78 
79  *penc = NULL;
80 
81  enc = av_mallocz(sizeof(*enc));
82  if (!enc)
83  return AVERROR(ENOMEM);
84 
85  enc->sch = sch;
86  enc->sch_idx = sch_idx;
87 
88  *penc = enc;
89 
90  return 0;
91 }
92 
94 {
95  const AVCodecHWConfig *config;
96  HWDevice *dev = NULL;
97 
98  if (frames_ref &&
99  ((AVHWFramesContext*)frames_ref->data)->format ==
100  ost->enc_ctx->pix_fmt) {
101  // Matching format, will try to use hw_frames_ctx.
102  } else {
103  frames_ref = NULL;
104  }
105 
106  for (int i = 0;; i++) {
107  config = avcodec_get_hw_config(ost->enc_ctx->codec, i);
108  if (!config)
109  break;
110 
111  if (frames_ref &&
113  (config->pix_fmt == AV_PIX_FMT_NONE ||
114  config->pix_fmt == ost->enc_ctx->pix_fmt)) {
115  av_log(ost->enc_ctx, AV_LOG_VERBOSE, "Using input "
116  "frames context (format %s) with %s encoder.\n",
117  av_get_pix_fmt_name(ost->enc_ctx->pix_fmt),
118  ost->enc_ctx->codec->name);
119  ost->enc_ctx->hw_frames_ctx = av_buffer_ref(frames_ref);
120  if (!ost->enc_ctx->hw_frames_ctx)
121  return AVERROR(ENOMEM);
122  return 0;
123  }
124 
125  if (!dev &&
127  dev = hw_device_get_by_type(config->device_type);
128  }
129 
130  if (dev) {
131  av_log(ost->enc_ctx, AV_LOG_VERBOSE, "Using device %s "
132  "(type %s) with %s encoder.\n", dev->name,
133  av_hwdevice_get_type_name(dev->type), ost->enc_ctx->codec->name);
134  ost->enc_ctx->hw_device_ctx = av_buffer_ref(dev->device_ref);
135  if (!ost->enc_ctx->hw_device_ctx)
136  return AVERROR(ENOMEM);
137  } else {
138  // No device required, or no device available.
139  }
140  return 0;
141 }
142 
144 {
145  const char *cname = ost->enc_ctx->codec->name;
146  uint8_t *encoder_string;
147  int encoder_string_len;
148 
149  if (av_dict_get(ost->st->metadata, "encoder", NULL, 0))
150  return 0;
151 
152  encoder_string_len = sizeof(LIBAVCODEC_IDENT) + strlen(cname) + 2;
153  encoder_string = av_mallocz(encoder_string_len);
154  if (!encoder_string)
155  return AVERROR(ENOMEM);
156 
157  if (!of->bitexact && !ost->bitexact)
158  av_strlcpy(encoder_string, LIBAVCODEC_IDENT " ", encoder_string_len);
159  else
160  av_strlcpy(encoder_string, "Lavc ", encoder_string_len);
161  av_strlcat(encoder_string, cname, encoder_string_len);
162  av_dict_set(&ost->st->metadata, "encoder", encoder_string,
164 
165  return 0;
166 }
167 
168 int enc_open(void *opaque, const AVFrame *frame)
169 {
170  OutputStream *ost = opaque;
171  InputStream *ist = ost->ist;
172  Encoder *e = ost->enc;
173  AVCodecContext *enc_ctx = ost->enc_ctx;
174  Decoder *dec = NULL;
175  const AVCodec *enc = enc_ctx->codec;
176  OutputFile *of = ost->file;
177  FrameData *fd;
178  int frame_samples = 0;
179  int ret;
180 
181  if (e->opened)
182  return 0;
183 
184  // frame is always non-NULL for audio and video
186 
187  if (frame) {
189  fd = (FrameData*)frame->opaque_ref->data;
190  }
191 
192  ret = set_encoder_id(of, ost);
193  if (ret < 0)
194  return ret;
195 
196  if (ist)
197  dec = ist->decoder;
198 
199  // the timebase is chosen by filtering code
200  if (ost->type == AVMEDIA_TYPE_AUDIO || ost->type == AVMEDIA_TYPE_VIDEO) {
201  enc_ctx->time_base = frame->time_base;
202  enc_ctx->framerate = fd->frame_rate_filter;
204  }
205 
206  switch (enc_ctx->codec_type) {
207  case AVMEDIA_TYPE_AUDIO:
209  frame->sample_rate > 0 &&
211  enc_ctx->sample_fmt = frame->format;
212  enc_ctx->sample_rate = frame->sample_rate;
214  if (ret < 0)
215  return ret;
216 
217  if (ost->bits_per_raw_sample)
218  enc_ctx->bits_per_raw_sample = ost->bits_per_raw_sample;
219  else
221  av_get_bytes_per_sample(enc_ctx->sample_fmt) << 3);
222  break;
223 
224  case AVMEDIA_TYPE_VIDEO: {
226  frame->width > 0 &&
227  frame->height > 0);
228  enc_ctx->width = frame->width;
229  enc_ctx->height = frame->height;
231  ost->frame_aspect_ratio.num ? // overridden by the -aspect cli option
232  av_mul_q(ost->frame_aspect_ratio, (AVRational){ enc_ctx->height, enc_ctx->width }) :
234 
235  enc_ctx->pix_fmt = frame->format;
236 
237  if (ost->bits_per_raw_sample)
238  enc_ctx->bits_per_raw_sample = ost->bits_per_raw_sample;
239  else
241  av_pix_fmt_desc_get(enc_ctx->pix_fmt)->comp[0].depth);
242 
243  enc_ctx->color_range = frame->color_range;
245  enc_ctx->color_trc = frame->color_trc;
246  enc_ctx->colorspace = frame->colorspace;
248 
249  for (int i = 0; i < frame->nb_side_data; i++) {
251  &enc_ctx->decoded_side_data, &enc_ctx->nb_decoded_side_data,
253  if (ret < 0) {
255  &enc_ctx->decoded_side_data,
256  &enc_ctx->nb_decoded_side_data);
258  "failed to configure video encoder: %s!\n",
259  av_err2str(ret));
260  return ret;
261  }
262  }
263 
266 #if FFMPEG_OPT_TOP
267  || ost->top_field_first >= 0
268 #endif
269  ) {
270  int top_field_first =
271 #if FFMPEG_OPT_TOP
272  ost->top_field_first >= 0 ?
273  ost->top_field_first :
274 #endif
276 
277  if (enc->id == AV_CODEC_ID_MJPEG)
278  enc_ctx->field_order = top_field_first ? AV_FIELD_TT : AV_FIELD_BB;
279  else
280  enc_ctx->field_order = top_field_first ? AV_FIELD_TB : AV_FIELD_BT;
281  } else
283 
284  break;
285  }
287  if (ost->enc_timebase.num)
289  "-enc_time_base not supported for subtitles, ignoring\n");
290  enc_ctx->time_base = AV_TIME_BASE_Q;
291 
292  if (!enc_ctx->width) {
293  enc_ctx->width = ost->ist->par->width;
294  enc_ctx->height = ost->ist->par->height;
295  }
296 
297  av_assert0(dec);
298  if (dec->subtitle_header) {
299  /* ASS code assumes this buffer is null terminated so add extra byte. */
300  enc_ctx->subtitle_header = av_mallocz(dec->subtitle_header_size + 1);
301  if (!enc_ctx->subtitle_header)
302  return AVERROR(ENOMEM);
303  memcpy(enc_ctx->subtitle_header, dec->subtitle_header,
304  dec->subtitle_header_size);
306  }
307 
308  break;
309  default:
310  av_assert0(0);
311  break;
312  }
313 
314  if (ost->bitexact)
315  enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
316 
317  if (!av_dict_get(ost->encoder_opts, "threads", NULL, 0))
318  av_dict_set(&ost->encoder_opts, "threads", "auto", 0);
319 
321  ret = av_dict_set(&ost->encoder_opts, "flags", "+copy_opaque", AV_DICT_MULTIKEY);
322  if (ret < 0)
323  return ret;
324  }
325 
326  av_dict_set(&ost->encoder_opts, "flags", "+frame_duration", AV_DICT_MULTIKEY);
327 
329  if (ret < 0) {
331  "Encoding hardware device setup failed: %s\n", av_err2str(ret));
332  return ret;
333  }
334 
335  if ((ret = avcodec_open2(ost->enc_ctx, enc, &ost->encoder_opts)) < 0) {
336  if (ret != AVERROR_EXPERIMENTAL)
337  av_log(ost, AV_LOG_ERROR, "Error while opening encoder - maybe "
338  "incorrect parameters such as bit_rate, rate, width or height.\n");
339  return ret;
340  }
341 
342  e->opened = 1;
343 
344  if (ost->enc_ctx->frame_size)
345  frame_samples = ost->enc_ctx->frame_size;
346 
347  ret = check_avoptions(ost->encoder_opts);
348  if (ret < 0)
349  return ret;
350 
351  if (ost->enc_ctx->bit_rate && ost->enc_ctx->bit_rate < 1000 &&
352  ost->enc_ctx->codec_id != AV_CODEC_ID_CODEC2 /* don't complain about 700 bit/s modes */)
353  av_log(ost, AV_LOG_WARNING, "The bitrate parameter is set too low."
354  " It takes bits/s as argument, not kbits/s\n");
355 
356  ret = avcodec_parameters_from_context(ost->par_in, ost->enc_ctx);
357  if (ret < 0) {
359  "Error initializing the output stream codec context.\n");
360  return ret;
361  }
362 
363  /*
364  * Add global input side data. For now this is naive, and copies it
365  * from the input stream's global side data. All side data should
366  * really be funneled over AVFrame and libavfilter, then added back to
367  * packet side data, and then potentially using the first packet for
368  * global side data.
369  */
370  if (ist) {
371  for (int i = 0; i < ist->st->codecpar->nb_coded_side_data; i++) {
372  AVPacketSideData *sd_src = &ist->st->codecpar->coded_side_data[i];
373  if (sd_src->type != AV_PKT_DATA_CPB_PROPERTIES) {
374  AVPacketSideData *sd_dst = av_packet_side_data_new(&ost->par_in->coded_side_data,
375  &ost->par_in->nb_coded_side_data,
376  sd_src->type, sd_src->size, 0);
377  if (!sd_dst)
378  return AVERROR(ENOMEM);
379  memcpy(sd_dst->data, sd_src->data, sd_src->size);
380  if (ist->autorotate && sd_src->type == AV_PKT_DATA_DISPLAYMATRIX)
381  av_display_rotation_set((int32_t *)sd_dst->data, 0);
382  }
383  }
384  }
385 
386  // copy timebase while removing common factors
387  if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0)
388  ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1});
389 
390  ret = of_stream_init(of, ost);
391  if (ret < 0)
392  return ret;
393 
394  return frame_samples;
395 }
396 
398 {
399  OutputFile *of = ost->file;
400 
401  if (of->recording_time != INT64_MAX &&
402  av_compare_ts(ts, tb, of->recording_time, AV_TIME_BASE_Q) >= 0) {
403  return 0;
404  }
405  return 1;
406 }
407 
408 static int do_subtitle_out(OutputFile *of, OutputStream *ost, const AVSubtitle *sub,
409  AVPacket *pkt)
410 {
411  Encoder *e = ost->enc;
412  int subtitle_out_max_size = 1024 * 1024;
413  int subtitle_out_size, nb, i, ret;
414  AVCodecContext *enc;
415  int64_t pts;
416 
417  if (sub->pts == AV_NOPTS_VALUE) {
418  av_log(ost, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
419  return exit_on_error ? AVERROR(EINVAL) : 0;
420  }
421  if ((of->start_time != AV_NOPTS_VALUE && sub->pts < of->start_time))
422  return 0;
423 
424  enc = ost->enc_ctx;
425 
426  /* Note: DVB subtitle need one packet to draw them and one other
427  packet to clear them */
428  /* XXX: signal it in the codec context ? */
430  nb = 2;
431  else if (enc->codec_id == AV_CODEC_ID_ASS)
432  nb = FFMAX(sub->num_rects, 1);
433  else
434  nb = 1;
435 
436  /* shift timestamp to honor -ss and make check_recording_time() work with -t */
437  pts = sub->pts;
438  if (of->start_time != AV_NOPTS_VALUE)
439  pts -= of->start_time;
440  for (i = 0; i < nb; i++) {
441  AVSubtitle local_sub = *sub;
442 
444  return AVERROR_EOF;
445 
446  ret = av_new_packet(pkt, subtitle_out_max_size);
447  if (ret < 0)
448  return AVERROR(ENOMEM);
449 
450  local_sub.pts = pts;
451  // start_display_time is required to be 0
452  local_sub.pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
453  local_sub.end_display_time -= sub->start_display_time;
454  local_sub.start_display_time = 0;
455 
456  if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE && i == 1)
457  local_sub.num_rects = 0;
458  else if (enc->codec_id == AV_CODEC_ID_ASS && sub->num_rects > 0) {
459  local_sub.num_rects = 1;
460  local_sub.rects += i;
461  }
462 
463  ost->frames_encoded++;
464 
465  subtitle_out_size = avcodec_encode_subtitle(enc, pkt->data, pkt->size, &local_sub);
466  if (subtitle_out_size < 0) {
467  av_log(ost, AV_LOG_FATAL, "Subtitle encoding failed\n");
468  return subtitle_out_size;
469  }
470 
471  av_shrink_packet(pkt, subtitle_out_size);
473  pkt->pts = sub->pts;
475  if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
476  /* XXX: the pts correction is handled here. Maybe handling
477  it in the codec would be better */
478  if (i == 0)
479  pkt->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, pkt->time_base);
480  else
481  pkt->pts += av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, pkt->time_base);
482  }
483  pkt->dts = pkt->pts;
484 
485  ret = sch_enc_send(e->sch, e->sch_idx, pkt);
486  if (ret < 0) {
488  return ret;
489  }
490  }
491 
492  return 0;
493 }
494 
496  const AVFrame *frame, const AVPacket *pkt,
497  uint64_t frame_num)
498 {
499  Encoder *e = ost->enc;
500  AVIOContext *io = es->io;
502  int64_t pts = frame ? frame->pts : pkt->pts;
503 
504  AVRational tbi = (AVRational){ 0, 1};
505  int64_t ptsi = INT64_MAX;
506 
507  const FrameData *fd = NULL;
508 
509  if (frame ? frame->opaque_ref : pkt->opaque_ref) {
510  fd = (const FrameData*)(frame ? frame->opaque_ref->data : pkt->opaque_ref->data);
511  tbi = fd->dec.tb;
512  ptsi = fd->dec.pts;
513  }
514 
515  pthread_mutex_lock(&es->lock);
516 
517  for (size_t i = 0; i < es->nb_components; i++) {
518  const EncStatsComponent *c = &es->components[i];
519 
520  switch (c->type) {
521  case ENC_STATS_LITERAL: avio_write (io, c->str, c->str_len); continue;
522  case ENC_STATS_FILE_IDX: avio_printf(io, "%d", ost->file->index); continue;
523  case ENC_STATS_STREAM_IDX: avio_printf(io, "%d", ost->index); continue;
524  case ENC_STATS_TIMEBASE: avio_printf(io, "%d/%d", tb.num, tb.den); continue;
525  case ENC_STATS_TIMEBASE_IN: avio_printf(io, "%d/%d", tbi.num, tbi.den); continue;
526  case ENC_STATS_PTS: avio_printf(io, "%"PRId64, pts); continue;
527  case ENC_STATS_PTS_IN: avio_printf(io, "%"PRId64, ptsi); continue;
528  case ENC_STATS_PTS_TIME: avio_printf(io, "%g", pts * av_q2d(tb)); continue;
529  case ENC_STATS_PTS_TIME_IN: avio_printf(io, "%g", ptsi == INT64_MAX ?
530  INFINITY : ptsi * av_q2d(tbi)); continue;
531  case ENC_STATS_FRAME_NUM: avio_printf(io, "%"PRIu64, frame_num); continue;
532  case ENC_STATS_FRAME_NUM_IN: avio_printf(io, "%"PRIu64, fd ? fd->dec.frame_num : -1); continue;
533  }
534 
535  if (frame) {
536  switch (c->type) {
537  case ENC_STATS_SAMPLE_NUM: avio_printf(io, "%"PRIu64, ost->samples_encoded); continue;
538  case ENC_STATS_NB_SAMPLES: avio_printf(io, "%d", frame->nb_samples); continue;
539  default: av_assert0(0);
540  }
541  } else {
542  switch (c->type) {
543  case ENC_STATS_DTS: avio_printf(io, "%"PRId64, pkt->dts); continue;
544  case ENC_STATS_DTS_TIME: avio_printf(io, "%g", pkt->dts * av_q2d(tb)); continue;
545  case ENC_STATS_PKT_SIZE: avio_printf(io, "%d", pkt->size); continue;
547  "K" : "N", 1); continue;
548  case ENC_STATS_BITRATE: {
549  double duration = FFMAX(pkt->duration, 1) * av_q2d(tb);
550  avio_printf(io, "%g", 8.0 * pkt->size / duration);
551  continue;
552  }
553  case ENC_STATS_AVG_BITRATE: {
554  double duration = pkt->dts * av_q2d(tb);
555  avio_printf(io, "%g", duration > 0 ? 8.0 * e->data_size / duration : -1.);
556  continue;
557  }
558  default: av_assert0(0);
559  }
560  }
561  }
562  avio_w8(io, '\n');
563  avio_flush(io);
564 
566 }
567 
568 static inline double psnr(double d)
569 {
570  return -10.0 * log10(d);
571 }
572 
573 static int update_video_stats(OutputStream *ost, const AVPacket *pkt, int write_vstats)
574 {
575  Encoder *e = ost->enc;
577  NULL);
578  AVCodecContext *enc = ost->enc_ctx;
579  enum AVPictureType pict_type;
580  int64_t frame_number;
581  double ti1, bitrate, avg_bitrate;
582  double psnr_val = -1;
583  int quality;
584 
585  quality = sd ? AV_RL32(sd) : -1;
586  pict_type = sd ? sd[4] : AV_PICTURE_TYPE_NONE;
587 
588  atomic_store(&ost->quality, quality);
589 
590  if ((enc->flags & AV_CODEC_FLAG_PSNR) && sd && sd[5]) {
591  // FIXME the scaling assumes 8bit
592  double error = AV_RL64(sd + 8) / (enc->width * enc->height * 255.0 * 255.0);
593  if (error >= 0 && error <= 1)
594  psnr_val = psnr(error);
595  }
596 
597  if (!write_vstats)
598  return 0;
599 
600  /* this is executed just the first time update_video_stats is called */
601  if (!vstats_file) {
602  vstats_file = fopen(vstats_filename, "w");
603  if (!vstats_file) {
604  perror("fopen");
605  return AVERROR(errno);
606  }
607  }
608 
609  frame_number = e->packets_encoded;
610  if (vstats_version <= 1) {
611  fprintf(vstats_file, "frame= %5"PRId64" q= %2.1f ", frame_number,
612  quality / (float)FF_QP2LAMBDA);
613  } else {
614  fprintf(vstats_file, "out= %2d st= %2d frame= %5"PRId64" q= %2.1f ",
615  ost->file->index, ost->index, frame_number,
616  quality / (float)FF_QP2LAMBDA);
617  }
618 
619  if (psnr_val >= 0)
620  fprintf(vstats_file, "PSNR= %6.2f ", psnr_val);
621 
622  fprintf(vstats_file,"f_size= %6d ", pkt->size);
623  /* compute pts value */
624  ti1 = pkt->dts * av_q2d(pkt->time_base);
625  if (ti1 < 0.01)
626  ti1 = 0.01;
627 
628  bitrate = (pkt->size * 8) / av_q2d(enc->time_base) / 1000.0;
629  avg_bitrate = (double)(e->data_size * 8) / ti1 / 1000.0;
630  fprintf(vstats_file, "s_size= %8.0fKiB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
631  (double)e->data_size / 1024, ti1, bitrate, avg_bitrate);
632  fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(pict_type));
633 
634  return 0;
635 }
636 
638  AVPacket *pkt)
639 {
640  Encoder *e = ost->enc;
641  AVCodecContext *enc = ost->enc_ctx;
642  const char *type_desc = av_get_media_type_string(enc->codec_type);
643  const char *action = frame ? "encode" : "flush";
644  int ret;
645 
646  if (frame) {
647  FrameData *fd = frame_data(frame);
648 
649  if (!fd)
650  return AVERROR(ENOMEM);
651 
653 
654  if (ost->enc_stats_pre.io)
655  enc_stats_write(ost, &ost->enc_stats_pre, frame, NULL,
656  ost->frames_encoded);
657 
658  ost->frames_encoded++;
659  ost->samples_encoded += frame->nb_samples;
660 
661  if (debug_ts) {
662  av_log(ost, AV_LOG_INFO, "encoder <- type:%s "
663  "frame_pts:%s frame_pts_time:%s time_base:%d/%d\n",
664  type_desc,
666  enc->time_base.num, enc->time_base.den);
667  }
668 
669  if (frame->sample_aspect_ratio.num && !ost->frame_aspect_ratio.num)
671  }
672 
674 
675  ret = avcodec_send_frame(enc, frame);
676  if (ret < 0 && !(ret == AVERROR_EOF && !frame)) {
677  av_log(ost, AV_LOG_ERROR, "Error submitting %s frame to the encoder\n",
678  type_desc);
679  return ret;
680  }
681 
682  while (1) {
683  FrameData *fd;
684 
686 
688  update_benchmark("%s_%s %d.%d", action, type_desc,
689  of->index, ost->index);
690 
691  pkt->time_base = enc->time_base;
692 
693  /* if two pass, output log on success and EOF */
694  if ((ret >= 0 || ret == AVERROR_EOF) && ost->logfile && enc->stats_out)
695  fprintf(ost->logfile, "%s", enc->stats_out);
696 
697  if (ret == AVERROR(EAGAIN)) {
698  av_assert0(frame); // should never happen during flushing
699  return 0;
700  } else if (ret < 0) {
701  if (ret != AVERROR_EOF)
702  av_log(ost, AV_LOG_ERROR, "%s encoding failed\n", type_desc);
703  return ret;
704  }
705 
706  fd = packet_data(pkt);
707  if (!fd)
708  return AVERROR(ENOMEM);
710 
711  // attach stream parameters to first packet if requested
713  if (e->attach_par && !e->packets_encoded) {
715  if (!fd->par_enc)
716  return AVERROR(ENOMEM);
717 
719  if (ret < 0)
720  return ret;
721  }
722 
724 
725  if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
727  if (ret < 0)
728  return ret;
729  }
730 
731  if (ost->enc_stats_post.io)
732  enc_stats_write(ost, &ost->enc_stats_post, NULL, pkt,
733  e->packets_encoded);
734 
735  if (debug_ts) {
736  av_log(ost, AV_LOG_INFO, "encoder -> type:%s "
737  "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s "
738  "duration:%s duration_time:%s\n",
739  type_desc,
743  }
744 
745  e->data_size += pkt->size;
746 
747  e->packets_encoded++;
748 
749  ret = sch_enc_send(e->sch, e->sch_idx, pkt);
750  if (ret < 0) {
752  return ret;
753  }
754  }
755 
756  av_assert0(0);
757 }
758 
759 static enum AVPictureType forced_kf_apply(void *logctx, KeyframeForceCtx *kf,
760  const AVFrame *frame)
761 {
762  double pts_time;
763 
764  if (kf->ref_pts == AV_NOPTS_VALUE)
765  kf->ref_pts = frame->pts;
766 
767  pts_time = (frame->pts - kf->ref_pts) * av_q2d(frame->time_base);
768  if (kf->index < kf->nb_pts &&
770  kf->index++;
771  goto force_keyframe;
772  } else if (kf->pexpr) {
773  double res;
774  kf->expr_const_values[FKF_T] = pts_time;
775  res = av_expr_eval(kf->pexpr,
776  kf->expr_const_values, NULL);
777  av_log(logctx, AV_LOG_TRACE,
778  "force_key_frame: n:%f n_forced:%f prev_forced_n:%f t:%f prev_forced_t:%f -> res:%f\n",
784  res);
785 
786  kf->expr_const_values[FKF_N] += 1;
787 
788  if (res) {
792  goto force_keyframe;
793  }
794  } else if (kf->type == KF_FORCE_SOURCE && (frame->flags & AV_FRAME_FLAG_KEY)) {
795  goto force_keyframe;
796  }
797 
798  return AV_PICTURE_TYPE_NONE;
799 
800 force_keyframe:
801  av_log(logctx, AV_LOG_DEBUG, "Forced keyframe at time %f\n", pts_time);
802  return AV_PICTURE_TYPE_I;
803 }
804 
806 {
807  OutputFile *of = ost->file;
808  enum AVMediaType type = ost->type;
809 
810  if (type == AVMEDIA_TYPE_SUBTITLE) {
811  const AVSubtitle *subtitle = frame && frame->buf[0] ?
812  (AVSubtitle*)frame->buf[0]->data : NULL;
813 
814  // no flushing for subtitles
815  return subtitle && subtitle->num_rects ?
816  do_subtitle_out(of, ost, subtitle, pkt) : 0;
817  }
818 
819  if (frame) {
821  return AVERROR_EOF;
822 
823  if (type == AVMEDIA_TYPE_VIDEO) {
824  frame->quality = ost->enc_ctx->global_quality;
826 
827 #if FFMPEG_OPT_TOP
828  if (ost->top_field_first >= 0) {
830  frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * (!!ost->top_field_first);
831  }
832 #endif
833  } else {
834  if (!(ost->enc_ctx->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE) &&
835  ost->enc_ctx->ch_layout.nb_channels != frame->ch_layout.nb_channels) {
837  "Audio channel count changed and encoder does not support parameter changes\n");
838  return 0;
839  }
840  }
841  }
842 
843  return encode_frame(of, ost, frame, pkt);
844 }
845 
847 {
848  char name[16];
849  snprintf(name, sizeof(name), "enc%d:%d:%s", ost->file->index, ost->index,
850  ost->enc_ctx->codec->name);
852 }
853 
855 {
856  av_packet_free(&et->pkt);
857  av_frame_free(&et->frame);
858 
859  memset(et, 0, sizeof(*et));
860 }
861 
863 {
864  memset(et, 0, sizeof(*et));
865 
866  et->frame = av_frame_alloc();
867  if (!et->frame)
868  goto fail;
869 
870  et->pkt = av_packet_alloc();
871  if (!et->pkt)
872  goto fail;
873 
874  return 0;
875 
876 fail:
877  enc_thread_uninit(et);
878  return AVERROR(ENOMEM);
879 }
880 
881 int encoder_thread(void *arg)
882 {
883  OutputStream *ost = arg;
884  Encoder *e = ost->enc;
885  EncoderThread et;
886  int ret = 0, input_status = 0;
887  int name_set = 0;
888 
889  ret = enc_thread_init(&et);
890  if (ret < 0)
891  goto finish;
892 
893  /* Open the subtitle encoders immediately. AVFrame-based encoders
894  * are opened through a callback from the scheduler once they get
895  * their first frame
896  *
897  * N.B.: because the callback is called from a different thread,
898  * enc_ctx MUST NOT be accessed before sch_enc_receive() returns
899  * for the first time for audio/video. */
900  if (ost->type != AVMEDIA_TYPE_VIDEO && ost->type != AVMEDIA_TYPE_AUDIO) {
901  ret = enc_open(ost, NULL);
902  if (ret < 0)
903  goto finish;
904  }
905 
906  while (!input_status) {
907  input_status = sch_enc_receive(e->sch, e->sch_idx, et.frame);
908  if (input_status < 0) {
909  if (input_status == AVERROR_EOF) {
910  av_log(ost, AV_LOG_VERBOSE, "Encoder thread received EOF\n");
911  if (e->opened)
912  break;
913 
914  av_log(ost, AV_LOG_ERROR, "Could not open encoder before EOF\n");
915  ret = AVERROR(EINVAL);
916  } else {
917  av_log(ost, AV_LOG_ERROR, "Error receiving a frame for encoding: %s\n",
918  av_err2str(ret));
919  ret = input_status;
920  }
921  goto finish;
922  }
923 
924  if (!name_set) {
926  name_set = 1;
927  }
928 
929  ret = frame_encode(ost, et.frame, et.pkt);
930 
931  av_packet_unref(et.pkt);
932  av_frame_unref(et.frame);
933 
934  if (ret < 0) {
935  if (ret == AVERROR_EOF)
936  av_log(ost, AV_LOG_VERBOSE, "Encoder returned EOF, finishing\n");
937  else
938  av_log(ost, AV_LOG_ERROR, "Error encoding a frame: %s\n",
939  av_err2str(ret));
940  break;
941  }
942  }
943 
944  // flush the encoder
945  if (ret == 0 || ret == AVERROR_EOF) {
946  ret = frame_encode(ost, NULL, et.pkt);
947  if (ret < 0 && ret != AVERROR_EOF)
948  av_log(ost, AV_LOG_ERROR, "Error flushing encoder: %s\n",
949  av_err2str(ret));
950  }
951 
952  // EOF is normal thread termination
953  if (ret == AVERROR_EOF)
954  ret = 0;
955 
956 finish:
957  enc_thread_uninit(&et);
958 
959  return ret;
960 }
961 
963 {
964  enc->attach_par = 1;
965  return enc->sch_idx;
966 }
frame_samples
static int frame_samples(const SyncQueue *sq, SyncQueueFrame frame)
Definition: sync_queue.c:141
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:31
AVSubtitle
Definition: avcodec.h:2227
KeyframeForceCtx::pts
int64_t * pts
Definition: ffmpeg.h:483
Decoder::subtitle_header
const uint8_t * subtitle_header
Definition: ffmpeg.h:336
avcodec_encode_subtitle
int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, const AVSubtitle *sub)
Definition: encode.c:190
AVFrame::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: frame.h:627
AV_PKT_DATA_DISPLAYMATRIX
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: packet.h:109
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:427
FrameData::par_enc
AVCodecParameters * par_enc
Definition: ffmpeg.h:612
AVCodec
AVCodec.
Definition: codec.h:187
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
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:186
AVFrame::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: frame.h:623
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:416
atomic_store
#define atomic_store(object, desired)
Definition: stdatomic.h:85
avcodec_receive_packet
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
Definition: encode.c:540
Encoder::opened
int opened
Definition: ffmpeg_enc.c:51
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:2232
LIBAVCODEC_IDENT
#define LIBAVCODEC_IDENT
Definition: version.h:43
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:685
FrameData
Definition: ffmpeg.h:593
AVCodecContext::decoded_side_data
AVFrameSideData ** decoded_side_data
Array containing static side data, such as HDR10 CLL / MDCV structures.
Definition: avcodec.h:2076
ENC_STATS_PTS
@ ENC_STATS_PTS
Definition: ffmpeg.h:432
ENC_STATS_FRAME_NUM_IN
@ ENC_STATS_FRAME_NUM_IN
Definition: ffmpeg.h:429
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1050
FKF_PREV_FORCED_N
@ FKF_PREV_FORCED_N
Definition: ffmpeg.h:415
AV_PKT_DATA_QUALITY_STATS
@ AV_PKT_DATA_QUALITY_STATS
This side data contains quality related information from the encoder.
Definition: packet.h:133
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:2962
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:436
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:200
AVFrame::nb_side_data
int nb_side_data
Definition: frame.h:578
AVPictureType
AVPictureType
Definition: avutil.h:277
KeyframeForceCtx::nb_pts
int nb_pts
Definition: ffmpeg.h:484
rational.h
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:264
int64_t
long long int64_t
Definition: coverity.c:34
AVSubtitle::num_rects
unsigned num_rects
Definition: avcodec.h:2231
ENC_STATS_AVG_BITRATE
@ ENC_STATS_AVG_BITRATE
Definition: ffmpeg.h:442
AVFrame::color_primaries
enum AVColorPrimaries color_primaries
Definition: frame.h:625
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:130
OutputFile::start_time
int64_t start_time
start time in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:586
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:634
Encoder::sch
Scheduler * sch
Definition: ffmpeg_enc.c:54
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:344
pixdesc.h
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:456
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:678
AVFrame::width
int width
Definition: frame.h:416
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:373
AVCodec::capabilities
int capabilities
Codec capabilities.
Definition: codec.h:206
FKF_T
@ FKF_T
Definition: ffmpeg.h:417
AVPacket::data
uint8_t * data
Definition: packet.h:522
ENC_STATS_LITERAL
@ ENC_STATS_LITERAL
Definition: ffmpeg.h:425
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:708
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:832
KeyframeForceCtx::type
int type
Definition: ffmpeg.h:478
AVCodecContext::subtitle_header
uint8_t * subtitle_header
Definition: avcodec.h:1891
forced_kf_apply
static enum AVPictureType forced_kf_apply(void *logctx, KeyframeForceCtx *kf, const AVFrame *frame)
Definition: ffmpeg_enc.c:759
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
av_display_rotation_set
void av_display_rotation_set(int32_t matrix[9], double angle)
Initialize a transformation matrix describing a pure clockwise rotation by the specified angle (in de...
Definition: display.c:51
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:540
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:616
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:326
HWDevice
Definition: ffmpeg.h:109
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
av_frame_side_data_clone
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags)
Add a new side data entry to an array based on existing side data, taking a reference towards the con...
Definition: frame.c:794
LATENCY_PROBE_ENC_POST
@ LATENCY_PROBE_ENC_POST
Definition: ffmpeg.h:105
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:313
set_encoder_id
static int set_encoder_id(OutputFile *of, OutputStream *ost)
Definition: ffmpeg_enc.c:143
AV_CODEC_FLAG_INTERLACED_ME
#define AV_CODEC_FLAG_INTERLACED_ME
interlaced motion estimation
Definition: avcodec.h:351
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:557
psnr
static double psnr(double d)
Definition: ffmpeg_enc.c:568
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:577
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: avpacket.c:74
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:637
ENC_STATS_TIMEBASE_IN
@ ENC_STATS_TIMEBASE_IN
Definition: ffmpeg.h:431
AV_FIELD_BT
@ AV_FIELD_BT
Bottom coded first, top displayed first.
Definition: defs.h:204
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:608
FrameData::frame_num
uint64_t frame_num
Definition: ffmpeg.h:600
AVFrame::opaque_ref
AVBufferRef * opaque_ref
Frame owner's private data.
Definition: frame.h:711
InputStream
Definition: ffmpeg.h:345
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:560
debug_ts
int debug_ts
Definition: ffmpeg_opt.c:76
AVPacketSideData::size
size_t size
Definition: packet.h:375
AVFrame::chroma_location
enum AVChromaLocation chroma_location
Definition: frame.h:636
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:201
AV_CODEC_ID_ASS
@ AV_CODEC_ID_ASS
Definition: codec_id.h:571
finish
static void finish(void)
Definition: movenc.c:342
vstats_version
int vstats_version
Definition: ffmpeg_opt.c:84
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:454
AVPacket::opaque_ref
AVBufferRef * opaque_ref
AVBufferRef for free use by the API user.
Definition: packet.h:558
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1065
fail
#define fail()
Definition: checkasm.h:179
av_shrink_packet
void av_shrink_packet(AVPacket *pkt, int size)
Reduce packet size, correctly zeroing padding.
Definition: avpacket.c:113
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:502
KeyframeForceCtx::ref_pts
int64_t ref_pts
Definition: ffmpeg.h:480
Encoder::attach_par
int attach_par
Definition: ffmpeg_enc.c:52
update_benchmark
void update_benchmark(const char *fmt,...)
Definition: ffmpeg.c:518
AVFrame::ch_layout
AVChannelLayout ch_layout
Channel layout of the audio data.
Definition: frame.h:745
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:643
FrameData::tb
AVRational tb
Definition: ffmpeg.h:603
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_FIELD_TB
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition: defs.h:203
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:330
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
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:302
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:118
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:550
enc_thread_uninit
static void enc_thread_uninit(EncoderThread *et)
Definition: ffmpeg_enc.c:854
avassert.h
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:671
FrameData::frame_rate_filter
AVRational frame_rate_filter
Definition: ffmpeg.h:606
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:206
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
AV_FRAME_SIDE_DATA_FLAG_UNIQUE
#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE
Definition: frame.h:1006
encoder_thread
int encoder_thread(void *arg)
Definition: ffmpeg_enc.c:881
ENC_STATS_PTS_IN
@ ENC_STATS_PTS_IN
Definition: ffmpeg.h:434
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:595
duration
int64_t duration
Definition: movenc.c:64
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:62
EncStats::components
EncStatsComponent * components
Definition: ffmpeg.h:454
intreadwrite.h
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: avpacket.c:98
vstats_filename
char * vstats_filename
Definition: ffmpeg_opt.c:59
AVCodecContext::nb_decoded_side_data
int nb_decoded_side_data
Definition: avcodec.h:2077
bitrate
int64_t bitrate
Definition: av1_levels.c:47
ENC_STATS_FILE_IDX
@ ENC_STATS_FILE_IDX
Definition: ffmpeg.h:426
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
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:159
ENC_STATS_BITRATE
@ ENC_STATS_BITRATE
Definition: ffmpeg.h:441
Encoder::data_size
uint64_t data_size
Definition: ffmpeg_enc.c:46
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
LATENCY_PROBE_ENC_PRE
@ LATENCY_PROBE_ENC_PRE
Definition: ffmpeg.h:104
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1574
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
AVPacketSideData::data
uint8_t * data
Definition: packet.h:374
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:495
FrameData::dec
struct FrameData::@4 dec
av_expr_eval
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:793
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:471
AVSubtitle::pts
int64_t pts
Same as packet pts, in AV_TIME_BASE.
Definition: avcodec.h:2233
ffmpeg_utils.h
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:112
AV_CODEC_ID_CODEC2
@ AV_CODEC_ID_CODEC2
Definition: codec_id.h:507
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:2221
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
frame
static AVFrame * frame
Definition: demux_decode.c:54
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:455
arg
const char * arg
Definition: jacosubdec.c:67
KeyframeForceCtx::expr_const_values
double expr_const_values[FKF_NB]
Definition: ffmpeg.h:488
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:222
ENC_STATS_KEYFRAME
@ ENC_STATS_KEYFRAME
Definition: ffmpeg.h:443
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:766
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:782
NULL
#define NULL
Definition: coverity.c:32
frame_encode
static int frame_encode(OutputStream *ost, AVFrame *frame, AVPacket *pkt)
Definition: ffmpeg_enc.c:805
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:695
InputStream::st
AVStream * st
Definition: ffmpeg.h:353
AV_DICT_MULTIKEY
#define AV_DICT_MULTIKEY
Allow to store several equal keys in the dictionary.
Definition: dict.h:84
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **ppar)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:66
AVCodec::type
enum AVMediaType type
Definition: codec.h:200
Decoder
Definition: ffmpeg.h:331
ENC_STATS_PTS_TIME
@ ENC_STATS_PTS_TIME
Definition: ffmpeg.h:433
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
EncStats::lock
pthread_mutex_t lock
Definition: ffmpeg.h:459
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: packet.h:376
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
AVCodecContext::subtitle_header_size
int subtitle_header_size
Header containing style information for text subtitles.
Definition: avcodec.h:1890
EncStats
Definition: ffmpeg.h:453
vstats_file
FILE * vstats_file
Definition: ffmpeg.c:109
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:823
FrameData::wallclock
int64_t wallclock[LATENCY_PROBE_NB]
Definition: ffmpeg.h:610
double
double
Definition: af_crystalizer.c:131
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
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:128
time.h
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:178
OutputFile::index
int index
Definition: ffmpeg.h:577
EncoderThread::pkt
AVPacket * pkt
Definition: ffmpeg_enc.c:61
ENC_STATS_PTS_TIME_IN
@ ENC_STATS_PTS_TIME_IN
Definition: ffmpeg.h:435
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:2265
pthread_mutex_unlock
#define pthread_mutex_unlock(a)
Definition: ffprobe.c:81
enc_loopback
int enc_loopback(Encoder *enc)
Definition: ffmpeg_enc.c:962
Scheduler
Definition: ffmpeg_sched.c:269
enc_thread_init
static int enc_thread_init(EncoderThread *et)
Definition: ffmpeg_enc.c:862
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:544
AVCodecContext::stats_out
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:1334
eval.h
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:446
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:199
AVPacket::size
int size
Definition: packet.h:523
FFMPEG_OPT_TOP
#define FFMPEG_OPT_TOP
Definition: ffmpeg.h:57
AVFrame::quality
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
Definition: frame.h:476
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:121
AVFrame::sample_rate
int sample_rate
Sample rate of the audio data.
Definition: frame.h:543
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1057
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
ENC_STATS_NB_SAMPLES
@ ENC_STATS_NB_SAMPLES
Definition: ffmpeg.h:439
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: ffmpeg.c:507
AVFrame::time_base
AVRational time_base
Time base for the timestamps in this frame.
Definition: frame.h:471
HWDevice::device_ref
AVBufferRef * device_ref
Definition: ffmpeg.h:112
hw_device_get_by_type
HWDevice * hw_device_get_by_type(enum AVHWDeviceType type)
Definition: ffmpeg_hw.c:30
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:431
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:278
frame_data
FrameData * frame_data(AVFrame *frame)
Get our axiliary frame data attached to the frame, allocating it if needed.
Definition: ffmpeg.c:474
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:821
AVSubtitle::end_display_time
uint32_t end_display_time
Definition: avcodec.h:2230
frame.h
enc_alloc
int enc_alloc(Encoder **penc, const AVCodec *codec, Scheduler *sch, unsigned sch_idx)
Definition: ffmpeg_enc.c:74
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:521
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:200
FrameData::pts
int64_t pts
Definition: ffmpeg.h:602
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:528
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: avpacket.c:63
Encoder
Definition: ffmpeg_enc.c:44
ENC_STATS_FRAME_NUM
@ ENC_STATS_FRAME_NUM
Definition: ffmpeg.h:428
KeyframeForceCtx
Definition: ffmpeg.h:477
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
AVCodec::id
enum AVCodecID id
Definition: codec.h:201
enc_thread_set_name
static void enc_thread_set_name(const OutputStream *ost)
Definition: ffmpeg_enc.c:846
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:56
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:59
AV_PKT_DATA_CPB_PROPERTIES
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
Definition: packet.h:146
AVFrame::nb_samples
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:424
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:515
FrameData::bits_per_raw_sample
int bits_per_raw_sample
Definition: ffmpeg.h:608
av_frame_side_data_free
void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd)
Free all side data entries and their contents, then zeroes out the values which the pointers are poin...
Definition: frame.c:81
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: avpacket.c:252
OutputFile::bitexact
int bitexact
Definition: ffmpeg.h:589
display.h
AV_FIELD_BB
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition: defs.h:202
exit_on_error
int exit_on_error
Definition: ffmpeg_opt.c:77
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:576
tb
#define tb
Definition: regdef.h:68
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:702
AVFrame::side_data
AVFrameSideData ** side_data
Definition: frame.h:577
ENC_STATS_STREAM_IDX
@ ENC_STATS_STREAM_IDX
Definition: ffmpeg.h:427
AVCodecContext::height
int height
Definition: avcodec.h:618
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
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:507
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:657
ENC_STATS_SAMPLE_NUM
@ ENC_STATS_SAMPLE_NUM
Definition: ffmpeg.h:438
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:603
avcodec.h
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:115
InputStream::decoder
Decoder * decoder
Definition: ffmpeg.h:362
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:174
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:95
hw_device_setup_for_encode
static int hw_device_setup_for_encode(OutputStream *ost, AVBufferRef *frames_ref)
Definition: ffmpeg_enc.c:93
EncoderThread::frame
AVFrame * frame
Definition: ffmpeg_enc.c:60
avformat.h
dict.h
av_packet_side_data_new
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
Definition: avpacket.c:704
AVFrame::sample_aspect_ratio
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:451
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
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:315
avio_printf
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
Writes a formatted string to the context.
AVFrame::hw_frames_ctx
AVBufferRef * hw_frames_ctx
For hwaccel-format frames, this should be a reference to the AVHWFramesContext describing the frame.
Definition: frame.h:695
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:445
AVFrame::height
int height
Definition: frame.h:416
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:749
HWDevice::name
const char * name
Definition: ffmpeg.h:110
Encoder::sch_idx
unsigned sch_idx
Definition: ffmpeg_enc.c:55
enc_open
int enc_open(void *opaque, const AVFrame *frame)
Definition: ffmpeg_enc.c:168
AVRational::den
int den
Denominator.
Definition: rational.h:60
KeyframeForceCtx::index
int index
Definition: ffmpeg.h:485
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
do_subtitle_out
static int do_subtitle_out(OutputFile *of, OutputStream *ost, const AVSubtitle *sub, AVPacket *pkt)
Definition: ffmpeg_enc.c:408
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:337
check_recording_time
static int check_recording_time(OutputStream *ost, int64_t ts, AVRational tb)
Definition: ffmpeg_enc.c:397
thread_queue.h
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:841
enc_free
void enc_free(Encoder **penc)
Definition: ffmpeg_enc.c:64
AV_CODEC_CAP_PARAM_CHANGE
#define AV_CODEC_CAP_PARAM_CHANGE
Codec supports changed parameters at any point.
Definition: codec.h:118
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:439
AVCodecContext::codec_type
enum AVMediaType codec_type
Definition: avcodec.h:453
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
avutil.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:342
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:137
KeyframeForceCtx::pexpr
AVExpr * pexpr
Definition: ffmpeg.h:487
FKF_N_FORCED
@ FKF_N_FORCED
Definition: ffmpeg.h:414
av_add_q
AVRational av_add_q(AVRational b, AVRational c)
Add two rationals.
Definition: rational.c:93
AVPacket
This structure stores compressed data.
Definition: packet.h:499
EncStatsComponent
Definition: ffmpeg.h:446
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
HWDevice::type
enum AVHWDeviceType type
Definition: ffmpeg.h:111
EncStats::nb_components
int nb_components
Definition: ffmpeg.h:455
packet_data
FrameData * packet_data(AVPacket *pkt)
Definition: ffmpeg.c:486
d
d
Definition: ffmpeg_filter.c:409
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:618
int32_t
int32_t
Definition: audioconvert.c:56
ENC_STATS_PKT_SIZE
@ ENC_STATS_PKT_SIZE
Definition: ffmpeg.h:440
timestamp.h
OutputStream
Definition: mux.c:53
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
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:334
avstring.h
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
FKF_N
@ FKF_N
Definition: ffmpeg.h:413
ENC_STATS_DTS_TIME
@ ENC_STATS_DTS_TIME
Definition: ffmpeg.h:437
OutputFile::recording_time
int64_t recording_time
desired length of the resulting file in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:585
of_stream_init
int of_stream_init(OutputFile *of, OutputStream *ost)
Definition: ffmpeg_mux.c:609
AV_PKT_FLAG_TRUSTED
#define AV_PKT_FLAG_TRUSTED
The packet comes from a trusted source.
Definition: packet.h:591
snprintf
#define snprintf
Definition: snprintf.h:34
EncStats::io
AVIOContext * io
Definition: ffmpeg.h:457
update_video_stats
static int update_video_stats(OutputStream *ost, const AVPacket *pkt, int write_vstats)
Definition: ffmpeg_enc.c:573
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:642
AVSubtitle::start_display_time
uint32_t start_display_time
Definition: avcodec.h:2229
ENC_STATS_TIMEBASE
@ ENC_STATS_TIMEBASE
Definition: ffmpeg.h:430
AVPacket::time_base
AVRational time_base
Time base of the packet's timestamps.
Definition: packet.h:566
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:2882
EncoderThread
Definition: ffmpeg_enc.c:59
OutputFile
Definition: ffmpeg.h:574
pthread_mutex_lock
#define pthread_mutex_lock(a)
Definition: ffprobe.c:77
Encoder::packets_encoded
uint64_t packets_encoded
Definition: ffmpeg_enc.c:49
InputStream::autorotate
int autorotate
Definition: ffmpeg.h:371
ff_thread_setname
static int ff_thread_setname(const char *name)
Definition: thread.h:216