FFmpeg
dts2pts.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 James Almer
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * Derive PTS by reordering DTS from supported streams
24  */
25 
26 #include <stdbool.h>
27 
28 #include "libavutil/attributes.h"
29 #include "libavutil/avassert.h"
30 #include "libavutil/fifo.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/tree.h"
33 
34 #include "bsf.h"
35 #include "bsf_internal.h"
36 #include "cbs.h"
37 #include "cbs_h264.h"
38 #include "cbs_h265.h"
39 #include "h264_parse.h"
40 #include "h264_ps.h"
41 #include "hevc/ps.h"
42 #include "libavutil/refstruct.h"
43 
44 typedef struct DTS2PTSNode {
47  int poc;
48  int gop;
49 } DTS2PTSNode;
50 
51 typedef struct DTS2PTSFrame {
53  int poc;
54  int poc_diff;
55  int gop;
56 } DTS2PTSFrame;
57 
58 typedef struct DTS2PTSH264Context {
61  int poc_diff;
62  int last_poc;
66 
67 typedef struct DTS2PTSHEVCContext {
68  int gop;
69  int poc_tid0;
72 
73 typedef struct DTS2PTSContext {
74  struct AVTreeNode *root;
77 
78  // Codec specific function pointers and constants
79  int (*init)(AVBSFContext *ctx);
81  void (*flush)(AVBSFContext *ctx);
82  size_t fifo_size;
83 
86 
87  union {
90  } u;
91 
92  int nb_frame;
93  int gop;
94  int eof;
96 
97 // AVTreeNode callbacks
98 static int cmp_insert(const void *key, const void *node)
99 {
100  int ret = ((const DTS2PTSNode *)key)->poc - ((const DTS2PTSNode *)node)->poc;
101  if (!ret)
102  ret = ((const DTS2PTSNode *)key)->gop - ((const DTS2PTSNode *)node)->gop;
103  return ret;
104 }
105 
106 static int cmp_find(const void *key, const void *node)
107 {
108  const DTS2PTSFrame * key1 = key;
109  const DTS2PTSNode *node1 = node;
110  int ret = FFDIFFSIGN(key1->poc, node1->poc);
111  if (!ret)
112  ret = key1->gop - node1->gop;
113  return ret;
114 }
115 
116 static int dec_poc(void *opaque, void *elem)
117 {
118  DTS2PTSNode *node = elem;
119  int dec = *(int *)opaque;
120  node->poc -= dec;
121  return 0;
122 }
123 
124 static int free_node(void *opaque, void *elem)
125 {
126  DTS2PTSNode *node = elem;
127  av_refstruct_unref(&node);
128  return 0;
129 }
130 
131 // Shared functions
133  int poc, int poc_diff, int gop)
134 {
136  for (int i = 0; i < poc_diff; i++) {
137  struct AVTreeNode *node = av_tree_node_alloc();
138  DTS2PTSNode *poc_node, *ret;
139  if (!node)
140  return AVERROR(ENOMEM);
141  poc_node = av_refstruct_pool_get(s->node_pool);
142  if (!poc_node) {
143  av_free(node);
144  return AVERROR(ENOMEM);
145  }
146  if (i && ts != AV_NOPTS_VALUE)
147  ts += duration / poc_diff;
148  *poc_node = (DTS2PTSNode) { ts, duration, poc++, gop };
149  ret = av_tree_insert(&s->root, poc_node, cmp_insert, &node);
150  if (ret && ret != poc_node) {
151  *ret = *poc_node;
152  av_refstruct_unref(&poc_node);
153  av_free(node);
154  }
155  }
156  return 0;
157 }
158 
159 // H.264
161  H264_NAL_SPS,
162  H264_NAL_PPS,
165 };
166 
168 {
170  DTS2PTSH264Context *h264 = &s->u.h264;
171 
172  s->cbc->decompose_unit_types = h264_decompose_unit_types;
173  s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(h264_decompose_unit_types);
174 
175  s->nb_frame = -(ctx->par_in->video_delay << 1);
176  h264->last_poc = h264->highest_poc = INT_MIN;
177 
178  return 0;
179 }
180 
182 {
183  if (header->nal_unit_header.nal_ref_idc == 0 ||
184  !header->adaptive_ref_pic_marking_mode_flag)
185  return 0;
186 
187  for (int i = 0; i < H264_MAX_MMCO_COUNT; i++) {
188  if (header->mmco[i].memory_management_control_operation == 0)
189  return 0;
190  else if (header->mmco[i].memory_management_control_operation == 5)
191  return 1;
192  }
193 
194  return 0;
195 }
196 
197 static int h264_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, int *queued)
198 {
200  DTS2PTSH264Context *h264 = &s->u.h264;
202  int poc_diff, ret;
203 
204  poc_diff = (h264->picture_structure == 3) + 1;
205  if (h264->sps.frame_mbs_only_flag && h264->poc_diff)
206  poc_diff = FFMIN(poc_diff, h264->poc_diff);
207  if (poc < 0) {
208  av_tree_enumerate(s->root, &poc_diff, NULL, dec_poc);
209  s->nb_frame -= poc_diff;
210  }
211  // Check if there was a POC reset (Like an IDR slice)
212  if (s->nb_frame > h264->highest_poc) {
213  s->nb_frame = 0;
214  s->gop = (s->gop + 1) % s->fifo_size;
215  h264->highest_poc = h264->last_poc;
216  }
217 
218  ret = alloc_and_insert_node(ctx, pkt->dts, pkt->duration, s->nb_frame, poc_diff, s->gop);
219  if (ret < 0)
220  return ret;
221  av_log(ctx, AV_LOG_DEBUG, "Queueing frame with POC %d, GOP %d, dts %"PRId64"\n",
222  poc, s->gop, pkt->dts);
223  s->nb_frame += poc_diff;
224 
225  // Add frame to output FIFO only once
226  if (*queued)
227  return 0;
228 
229  frame = (DTS2PTSFrame) { pkt, poc, poc_diff, s->gop };
230  ret = av_fifo_write(s->fifo, &frame, 1);
231  av_assert2(ret >= 0);
232  *queued = 1;
233 
234  return 0;
235 }
236 
238 {
240  DTS2PTSH264Context *h264 = &s->u.h264;
241  CodedBitstreamFragment *au = &s->au;
242  AVPacket *in;
243  int output_picture_number = INT_MIN;
244  int field_poc[2];
245  int queued = 0, ret;
246 
247  ret = ff_bsf_get_packet(ctx, &in);
248  if (ret < 0)
249  return ret;
250 
251  ret = ff_cbs_read_packet(s->cbc, au, in);
252  if (ret < 0) {
253  av_log(ctx, AV_LOG_WARNING, "Failed to parse access unit.\n");
254  goto fail;
255  }
256 
257  for (int i = 0; i < au->nb_units; i++) {
258  CodedBitstreamUnit *unit = &au->units[i];
259 
260  switch (unit->type) {
261  case H264_NAL_IDR_SLICE:
262  h264->poc.prev_frame_num = 0;
263  h264->poc.prev_frame_num_offset = 0;
264  h264->poc.prev_poc_msb =
265  h264->poc.prev_poc_lsb = 0;
267  case H264_NAL_SLICE: {
268  const H264RawSlice *slice = unit->content;
269  const H264RawSliceHeader *header = &slice->header;
270  const CodedBitstreamH264Context *cbs_h264 = s->cbc->priv_data;
271  const H264RawSPS *sps = cbs_h264->active_sps;
272  int got_reset;
273 
274  if (!sps) {
275  av_log(ctx, AV_LOG_ERROR, "No active SPS for a slice\n");
277  goto fail;
278  }
279  // Initialize the SPS struct with the fields ff_h264_init_poc() cares about
280  h264->sps.frame_mbs_only_flag = sps->frame_mbs_only_flag;
281  h264->sps.log2_max_frame_num = sps->log2_max_frame_num_minus4 + 4;
282  h264->sps.poc_type = sps->pic_order_cnt_type;
283  h264->sps.log2_max_poc_lsb = sps->log2_max_pic_order_cnt_lsb_minus4 + 4;
284  h264->sps.offset_for_non_ref_pic = sps->offset_for_non_ref_pic;
285  h264->sps.offset_for_top_to_bottom_field = sps->offset_for_top_to_bottom_field;
286  h264->sps.poc_cycle_length = sps->num_ref_frames_in_pic_order_cnt_cycle;
287  for (int j = 0; j < h264->sps.poc_cycle_length; j++)
288  h264->sps.offset_for_ref_frame[j] = sps->offset_for_ref_frame[j];
289 
290  h264->picture_structure = sps->frame_mbs_only_flag ? 3 :
291  (header->field_pic_flag ?
292  header->field_pic_flag + header->bottom_field_flag : 3);
293 
294  h264->poc.frame_num = header->frame_num;
295  h264->poc.poc_lsb = header->pic_order_cnt_lsb;
296  h264->poc.delta_poc_bottom = header->delta_pic_order_cnt_bottom;
297  h264->poc.delta_poc[0] = header->delta_pic_order_cnt[0];
298  h264->poc.delta_poc[1] = header->delta_pic_order_cnt[1];
299 
300  field_poc[0] = field_poc[1] = INT_MAX;
301  ret = ff_h264_init_poc(field_poc, &output_picture_number, &h264->sps,
302  &h264->poc, h264->picture_structure,
303  header->nal_unit_header.nal_ref_idc);
304  if (ret < 0) {
305  av_log(ctx, AV_LOG_ERROR, "ff_h264_init_poc() failure\n");
306  goto fail;
307  }
308 
309  got_reset = get_mmco_reset(header);
310  h264->poc.prev_frame_num = got_reset ? 0 : h264->poc.frame_num;
311  h264->poc.prev_frame_num_offset = got_reset ? 0 : h264->poc.frame_num_offset;
312  if (header->nal_unit_header.nal_ref_idc != 0) {
313  h264->poc.prev_poc_msb = got_reset ? 0 : h264->poc.poc_msb;
314  if (got_reset)
315  h264->poc.prev_poc_lsb = h264->picture_structure == 2 ? 0 : field_poc[0];
316  else
317  h264->poc.prev_poc_lsb = h264->poc.poc_lsb;
318  }
319 
320  if (output_picture_number != h264->last_poc) {
321  if (h264->last_poc != INT_MIN) {
322  int64_t diff = FFABS(h264->last_poc - (int64_t)output_picture_number);
323 
324  if ((output_picture_number < 0) && !h264->last_poc)
325  h264->poc_diff = 0;
326  else if (FFABS((int64_t)output_picture_number) < h264->poc_diff) {
327  diff = FFABS(output_picture_number);
328  h264->poc_diff = 0;
329  }
330  if ((!h264->poc_diff || (h264->poc_diff > diff)) && diff <= INT_MAX) {
331  h264->poc_diff = diff;
332  if (h264->poc_diff == 1 && h264->sps.frame_mbs_only_flag) {
333  av_tree_enumerate(s->root, &h264->poc_diff, NULL, dec_poc);
334  s->nb_frame -= 2;
335  }
336  }
337  }
338  h264->last_poc = output_picture_number;
339  h264->highest_poc = FFMAX(h264->highest_poc, output_picture_number);
340 
341  ret = h264_queue_frame(ctx, in, output_picture_number, &queued);
342  if (ret < 0)
343  goto fail;
344  }
345  break;
346  }
347  default:
348  break;
349  }
350  }
351 
352  if (output_picture_number == INT_MIN) {
353  av_log(ctx, AV_LOG_ERROR, "No slices in access unit\n");
355  goto fail;
356  }
357 
358  ret = 0;
359 fail:
360  ff_cbs_fragment_reset(au);
361  if (!queued)
362  av_packet_free(&in);
363 
364  return ret;
365 }
366 
368 {
370  DTS2PTSH264Context *h264 = &s->u.h264;
371 
372  memset(&h264->sps, 0, sizeof(h264->sps));
373  memset(&h264->poc, 0, sizeof(h264->poc));
374  s->nb_frame = -(ctx->par_in->video_delay << 1);
375  h264->last_poc = h264->highest_poc = INT_MIN;
376 }
377 
379 {
381  DTS2PTSHEVCContext *hevc = &s->u.hevc;
382 
383  hevc->gop = -1;
384  hevc->poc_tid0 = 0;
385  hevc->highest_poc = INT_MIN;
386  s->nb_frame = -ctx->par_in->video_delay;
387 
388  return 0;
389 }
390 
392 {
393  hevc_init(ctx);
394 }
395 
396 static int hevc_init_nb_frame(AVBSFContext *ctx, int poc)
397 {
399  const CodedBitstreamH265Context *cbs_hevc = s->cbc->priv_data;
400  const H265RawVPS *vps = cbs_hevc->active_vps;
401 
402  if (!vps)
403  return AVERROR_INVALIDDATA;
404 
405  int latency = vps->vps_max_num_reorder_pics[0];
406  if (vps->vps_max_latency_increase_plus1[0])
407  latency += vps->vps_max_latency_increase_plus1[0] - 1;
408 
409  s->nb_frame = poc - latency;
410  av_log(ctx, AV_LOG_DEBUG, "Latency %d, poc %d, nb_frame %d\n",
411  latency, poc, s->nb_frame);
412 
413  return 0;
414 }
415 
416 static int same_gop(void *opaque, void *elem)
417 {
418  DTS2PTSNode *node = elem;
419  int gop = ((int *)opaque)[1];
420  return FFDIFFSIGN(gop, node->gop);
421 }
422 
423 static int hevc_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, bool *queued)
424 {
426  DTS2PTSHEVCContext *hevc = &s->u.hevc;
427  int ret;
428 
429  if (hevc->gop == -1) {
430  ret = hevc_init_nb_frame(ctx, poc);
431  if (ret < 0)
432  return ret;
433  hevc->gop = s->gop;
434  }
435 
436  hevc->highest_poc = FFMAX(hevc->highest_poc, poc);
437  if (s->nb_frame > hevc->highest_poc) {
438  s->nb_frame = 0;
439  s->gop = (s->gop + 1) % s->fifo_size;
440  hevc->highest_poc = poc;
441  }
442 
443  if (poc < s->nb_frame && hevc->gop == s->gop) {
444  int tmp[] = {s->nb_frame - poc, s->gop};
445 
446  s->nb_frame -= tmp[0];
448  }
449 
450  ret = alloc_and_insert_node(ctx, pkt->dts, pkt->duration, s->nb_frame, 1, s->gop);
451  if (ret < 0)
452  return ret;
453 
454  av_log(ctx, AV_LOG_DEBUG, "Queueing frame with POC %d, GOP %d, nb_frame %d, dts %"PRId64"\n",
455  poc, s->gop, s->nb_frame, pkt->dts);
456  s->nb_frame++;
457 
458  DTS2PTSFrame frame = {
459  .pkt = pkt,
460  .poc = poc,
461  .poc_diff = 1,
462  .gop = s->gop,
463  };
464  ret = av_fifo_write(s->fifo, &frame, 1);
465  if (ret < 0)
466  return ret;
467 
468  *queued = true;
469 
470  return 0;
471 }
472 
474 {
476  DTS2PTSHEVCContext *hevc = &s->u.hevc;
477  CodedBitstreamFragment *au = &s->au;
478  AVPacket *in;
479  bool queued = 0;
480  int ret = ff_bsf_get_packet(ctx, &in);
481  if (ret < 0)
482  return ret;
483 
484  ret = ff_cbs_read_packet(s->cbc, au, in);
485  if (ret < 0) {
486  av_log(ctx, AV_LOG_WARNING, "Failed to parse access unit.\n");
487  goto fail;
488  }
489 
490  for (int i = 0; i < au->nb_units; i++) {
491  CodedBitstreamUnit *unit = &au->units[i];
493 
494  bool is_slice = type <= HEVC_NAL_RASL_R || (type >= HEVC_NAL_BLA_W_LP &&
496  if (!is_slice)
497  continue;
498 
499  const H265RawSliceHeader *slice = unit->content;
501  continue;
502 
503  const CodedBitstreamH265Context *cbs_hevc = s->cbc->priv_data;
504  const H265RawSPS *sps = cbs_hevc->active_sps;
505  if (!sps) {
506  av_log(ctx, AV_LOG_ERROR, "No active SPS for a slice\n");
508  goto fail;
509  }
510 
511  int poc;
513  poc = 0;
514  hevc->gop = (hevc->gop + 1) % s->fifo_size;
515  } else {
516  unsigned log2_max_poc_lsb = sps->log2_max_pic_order_cnt_lsb_minus4 + 4;
517  int poc_lsb = slice->slice_pic_order_cnt_lsb;
518 
519  poc = ff_hevc_compute_poc2(log2_max_poc_lsb, hevc->poc_tid0, poc_lsb, type);
520  }
521 
522  if (slice->nal_unit_header.nuh_temporal_id_plus1 == 1 &&
526  type != HEVC_NAL_RASL_R) {
527  hevc->poc_tid0 = poc;
528  }
529 
530  ret = hevc_queue_frame(ctx, in, poc, &queued);
531  if (ret < 0)
532  goto fail;
533  break;
534  }
535 
536  if (!queued) {
537  av_log(ctx, AV_LOG_ERROR, "No slices in access unit\n");
539  }
540 
541 fail:
542  ff_cbs_fragment_reset(au);
543  if (!queued)
544  av_packet_free(&in);
545  return ret;
546 }
547 
548 // Core functions
549 static const struct {
550  enum AVCodecID id;
553  void (*flush)(AVBSFContext *ctx);
554  size_t fifo_size;
555 } func_tab[] = {
558 };
559 
561 {
563  CodedBitstreamFragment *au = &s->au;
564  int i, ret;
565 
566  for (i = 0; i < FF_ARRAY_ELEMS(func_tab); i++) {
567  if (func_tab[i].id == ctx->par_in->codec_id) {
568  s->init = func_tab[i].init;
569  s->filter = func_tab[i].filter;
570  s->flush = func_tab[i].flush;
571  s->fifo_size = func_tab[i].fifo_size;
572  break;
573  }
574  }
575  if (i == FF_ARRAY_ELEMS(func_tab))
576  return AVERROR_BUG;
577  av_assert0(s->filter && s->fifo_size);
578 
579  s->fifo = av_fifo_alloc2(s->fifo_size, sizeof(DTS2PTSFrame), 0);
580  if (!s->fifo)
581  return AVERROR(ENOMEM);
582 
583  s->node_pool = av_refstruct_pool_alloc(sizeof(DTS2PTSNode),
585 
586  if (!s->node_pool)
587  return AVERROR(ENOMEM);
588 
589  ret = ff_cbs_init(&s->cbc, ctx->par_in->codec_id, ctx);
590  if (ret < 0)
591  return ret;
592 
593  if (s->init) {
594  ret = s->init(ctx);
595  if (ret < 0)
596  return ret;
597  }
598 
599  if (!ctx->par_in->extradata_size)
600  return 0;
601 
602  ret = ff_cbs_read_extradata(s->cbc, au, ctx->par_in);
603  if (ret < 0)
604  av_log(ctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
605 
606  ff_cbs_fragment_reset(au);
607 
608  return 0;
609 }
610 
612 {
614  DTS2PTSNode *poc_node = NULL, *next[2] = { NULL, NULL };
616  int ret;
617 
618  // Fill up the FIFO and POC tree
619  while (!s->eof && av_fifo_can_write(s->fifo)) {
620  ret = s->filter(ctx);
621  if (ret < 0) {
622  if (ret != AVERROR_EOF)
623  return ret;
624  s->eof = 1;
625  }
626  }
627 
628  if (!av_fifo_can_read(s->fifo))
629  return AVERROR_EOF;
630 
631  // Fetch a packet from the FIFO
632  ret = av_fifo_read(s->fifo, &frame, 1);
633  av_assert2(ret >= 0);
635  av_packet_free(&frame.pkt);
636 
637  // Search the timestamp for the requested POC and set PTS
638  poc_node = av_tree_find(s->root, &frame, cmp_find, (void **)next);
639  if (!poc_node) {
640  poc_node = next[1];
641  if (!poc_node || poc_node->poc != frame.poc)
642  poc_node = next[0];
643  }
644  if (poc_node && poc_node->poc == frame.poc) {
645  out->pts = poc_node->dts;
646  if (!s->eof) {
647  // Remove the found entry from the tree
648  DTS2PTSFrame dup = (DTS2PTSFrame) { NULL, frame.poc + 1, frame.poc_diff, frame.gop };
649  for (; dup.poc_diff > 0; dup.poc++, dup.poc_diff--) {
650  struct AVTreeNode *node = NULL;
651  if (!poc_node || poc_node->dts != out->pts)
652  continue;
653  av_tree_insert(&s->root, poc_node, cmp_insert, &node);
654  av_refstruct_unref(&poc_node);
655  av_free(node);
656  poc_node = av_tree_find(s->root, &dup, cmp_find, NULL);
657  }
658  }
659  } else if (s->eof && frame.poc > INT_MIN) {
660  DTS2PTSFrame dup = (DTS2PTSFrame) { NULL, frame.poc - 1, frame.poc_diff, frame.gop };
661  poc_node = av_tree_find(s->root, &dup, cmp_find, NULL);
662  if (poc_node && poc_node->poc == dup.poc) {
663  out->pts = poc_node->dts;
664  if (out->pts != AV_NOPTS_VALUE)
665  out->pts += poc_node->duration;
666  ret = alloc_and_insert_node(ctx, out->pts, out->duration,
667  frame.poc, frame.poc_diff, frame.gop);
668  if (ret < 0) {
670  return ret;
671  }
672  av_log(ctx, AV_LOG_DEBUG, "Queueing frame for POC %d, GOP %d, dts %"PRId64", "
673  "generated from POC %d, GOP %d, dts %"PRId64", duration %"PRId64"\n",
674  frame.poc, frame.gop, out->pts,
675  poc_node->poc, poc_node->gop, poc_node->dts, poc_node->duration);
676  } else
677  av_log(ctx, AV_LOG_WARNING, "No timestamp for POC %d in tree\n", frame.poc);
678  } else
679  av_log(ctx, AV_LOG_WARNING, "No timestamp for POC %d in tree\n", frame.poc);
680  av_log(ctx, AV_LOG_DEBUG, "Returning frame for POC %d, GOP %d, dts %"PRId64", pts %"PRId64"\n",
681  frame.poc, frame.gop, out->dts, out->pts);
682 
683  return 0;
684 }
685 
687 {
690 
691  if (s->flush)
692  s->flush(ctx);
693  s->eof = 0;
694  s->gop = 0;
695 
696  while (s->fifo && av_fifo_read(s->fifo, &frame, 1) >= 0)
697  av_packet_free(&frame.pkt);
698 
700  av_tree_destroy(s->root);
701  s->root = NULL;
702 
703  ff_cbs_fragment_reset(&s->au);
704  if (s->cbc)
705  ff_cbs_flush(s->cbc);
706 }
707 
709 {
711 
713 
714  av_fifo_freep2(&s->fifo);
715  av_refstruct_pool_uninit(&s->node_pool);
716  ff_cbs_fragment_free(&s->au);
717  ff_cbs_close(&s->cbc);
718 }
719 
720 static const enum AVCodecID dts2pts_codec_ids[] = {
724 };
725 
727  .p.name = "dts2pts",
728  .p.codec_ids = dts2pts_codec_ids,
729  .priv_data_size = sizeof(DTS2PTSContext),
730  .init = dts2pts_init,
731  .flush = dts2pts_flush,
732  .close = dts2pts_close,
734 };
H264_NAL_PPS
@ H264_NAL_PPS
Definition: h264.h:42
SPS::offset_for_ref_frame
int32_t offset_for_ref_frame[256]
Definition: h264_ps.h:79
hevc_init
static int hevc_init(AVBSFContext *ctx)
Definition: dts2pts.c:378
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:433
DTS2PTSContext::u
union DTS2PTSContext::@72 u
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
H265RawSliceHeader::first_slice_segment_in_pic_flag
uint8_t first_slice_segment_in_pic_flag
Definition: cbs_h265.h:496
DTS2PTSContext::node_pool
AVRefStructPool * node_pool
Definition: dts2pts.c:76
av_fifo_can_write
size_t av_fifo_can_write(const AVFifo *f)
Definition: fifo.c:94
cmp_find
static int cmp_find(const void *key, const void *node)
Definition: dts2pts.c:106
H264POCContext::frame_num_offset
int frame_num_offset
for POC type 2
Definition: h264_parse.h:90
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
bsf_internal.h
dts2pts_flush
static void dts2pts_flush(AVBSFContext *ctx)
Definition: dts2pts.c:686
DTS2PTSContext::fifo_size
size_t fifo_size
Definition: dts2pts.c:82
func_tab
static const struct @71 func_tab[]
out
static FILE * out
Definition: movenc.c:55
H264POCContext::delta_poc_bottom
int delta_poc_bottom
Definition: h264_parse.h:85
DTS2PTSFrame::gop
int gop
Definition: dts2pts.c:55
DTS2PTSHEVCContext::highest_poc
int highest_poc
Definition: dts2pts.c:70
SPS::offset_for_non_ref_pic
int offset_for_non_ref_pic
Definition: h264_ps.h:54
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
av_tree_insert
void * av_tree_insert(AVTreeNode **tp, void *key, int(*cmp)(const void *key, const void *b), AVTreeNode **next)
Insert or remove an element.
Definition: tree.c:59
DTS2PTSFrame::poc
int poc
Definition: dts2pts.c:53
cbs_h264.h
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:114
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
int64_t
long long int64_t
Definition: coverity.c:34
DTS2PTSH264Context
Definition: dts2pts.c:58
h264_parse.h
AVTreeNode::elem
void * elem
Definition: tree.c:28
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:226
H265RawNALUnitHeader::nuh_temporal_id_plus1
uint8_t nuh_temporal_id_plus1
Definition: cbs_h265.h:33
HEVC_NAL_TSA_N
@ HEVC_NAL_TSA_N
Definition: hevc.h:31
DTS2PTSContext
Definition: dts2pts.c:73
HEVC_NAL_IDR_N_LP
@ HEVC_NAL_IDR_N_LP
Definition: hevc.h:49
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:81
dts2pts_filter
static int dts2pts_filter(AVBSFContext *ctx, AVPacket *out)
Definition: dts2pts.c:611
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:613
alloc_and_insert_node
static int alloc_and_insert_node(AVBSFContext *ctx, int64_t ts, int64_t duration, int poc, int poc_diff, int gop)
Definition: dts2pts.c:132
cbs_h265.h
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_tree_node_alloc
struct AVTreeNode * av_tree_node_alloc(void)
Allocate an AVTreeNode.
Definition: tree.c:34
HEVC_NAL_IDR_W_RADL
@ HEVC_NAL_IDR_W_RADL
Definition: hevc.h:48
h264_init
static int h264_init(AVBSFContext *ctx)
Definition: dts2pts.c:167
ff_bsf_get_packet
int ff_bsf_get_packet(AVBSFContext *ctx, AVPacket **pkt)
Called by the bitstream filters to get the next packet for filtering.
Definition: bsf.c:235
DTS2PTSFrame::pkt
AVPacket * pkt
Definition: dts2pts.c:52
SPS::frame_mbs_only_flag
int frame_mbs_only_flag
Definition: h264_ps.h:62
av_tree_enumerate
void av_tree_enumerate(AVTreeNode *t, void *opaque, int(*cmp)(void *opaque, void *elem), int(*enu)(void *opaque, void *elem))
Apply enu(opaque, &elem) to all the elements in the tree in a given range.
Definition: tree.c:155
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
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
H264POCContext::prev_poc_lsb
int prev_poc_lsb
poc_lsb of the last reference pic for POC type 0
Definition: h264_parse.h:89
DTS2PTSH264Context::poc
H264POCContext poc
Definition: dts2pts.c:59
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:77
DTS2PTSH264Context::poc_diff
int poc_diff
Definition: dts2pts.c:61
H264POCContext::delta_poc
int delta_poc[2]
Definition: h264_parse.h:86
H265RawSPS
Definition: cbs_h265.h:245
SPS::poc_type
int poc_type
pic_order_cnt_type
Definition: h264_ps.h:51
H265RawVPS
Definition: cbs_h265.h:184
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
DTS2PTSContext::fifo
AVFifo * fifo
Definition: dts2pts.c:75
DTS2PTSH264Context::sps
SPS sps
Definition: dts2pts.c:60
fifo.h
H264POCContext::prev_frame_num
int prev_frame_num
frame_num of the last pic for POC type 1/2
Definition: h264_parse.h:92
bsf.h
same_gop
static int same_gop(void *opaque, void *elem)
Definition: dts2pts.c:416
fail
#define fail()
Definition: checkasm.h:224
av_fifo_write
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition: fifo.c:188
CodedBitstreamH264Context::active_sps
const H264RawSPS * active_sps
Definition: cbs_h264.h:436
H264_MAX_MMCO_COUNT
@ H264_MAX_MMCO_COUNT
Definition: h264.h:92
DTS2PTSHEVCContext
Definition: dts2pts.c:67
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
H264_MAX_DPB_FRAMES
@ H264_MAX_DPB_FRAMES
Definition: h264.h:76
refstruct.h
FFDIFFSIGN
#define FFDIFFSIGN(x, y)
Comparator.
Definition: macros.h:45
CodedBitstreamFragment::units
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:175
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
H265RawSliceHeader::slice_pic_order_cnt_lsb
uint16_t slice_pic_order_cnt_lsb
Definition: cbs_h265.h:509
av_fifo_read
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition: fifo.c:240
DTS2PTSContext::cbc
CodedBitstreamContext * cbc
Definition: dts2pts.c:84
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:129
ff_dts2pts_bsf
const FFBitStreamFilter ff_dts2pts_bsf
Definition: dts2pts.c:726
HEVC_MAX_DPB_SIZE
@ HEVC_MAX_DPB_SIZE
Definition: hevc.h:120
s
#define s(width, name)
Definition: cbs_vp9.c:198
H264POCContext::prev_frame_num_offset
int prev_frame_num_offset
for POC type 2
Definition: h264_parse.h:91
DTS2PTSContext::filter
int(* filter)(AVBSFContext *ctx)
Definition: dts2pts.c:80
DTS2PTSNode::poc
int poc
Definition: dts2pts.c:47
DTS2PTSNode::dts
int64_t dts
Definition: dts2pts.c:45
filter
int(* filter)(AVBSFContext *ctx)
Definition: dts2pts.c:552
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
CodedBitstreamUnitType
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition: cbs.h:54
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
DTS2PTSContext::nb_frame
int nb_frame
Definition: dts2pts.c:92
AVRefStructPool
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
Definition: refstruct.c:183
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
key
const char * key
Definition: hwcontext_opencl.c:189
h264_flush
static void h264_flush(AVBSFContext *ctx)
Definition: dts2pts.c:367
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
NULL
#define NULL
Definition: coverity.c:32
FFBitStreamFilter
Definition: bsf_internal.h:27
SPS
Sequence parameter set.
Definition: h264_ps.h:44
DTS2PTSContext::flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:81
H264_NAL_IDR_SLICE
@ H264_NAL_IDR_SLICE
Definition: h264.h:39
HEVC_NAL_STSA_N
@ HEVC_NAL_STSA_N
Definition: hevc.h:33
DTS2PTSNode
Definition: dts2pts.c:44
av_fifo_can_read
size_t av_fifo_can_read(const AVFifo *f)
Definition: fifo.c:87
AVTreeNode
Definition: tree.c:26
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:553
av_refstruct_pool_get
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition: refstruct.c:297
DTS2PTSHEVCContext::gop
int gop
Definition: dts2pts.c:68
vps
static int FUNC() vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
Definition: cbs_h265_syntax_template.c:423
get_mmco_reset
static int get_mmco_reset(const H264RawSliceHeader *header)
Definition: dts2pts.c:181
av_packet_move_ref
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition: packet.c:490
av_tree_destroy
void av_tree_destroy(AVTreeNode *t)
Definition: tree.c:146
h264_ps.h
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
CodedBitstreamH264Context
Definition: cbs_h264.h:424
dts2pts_init
static int dts2pts_init(AVBSFContext *ctx)
Definition: dts2pts.c:560
HEVC_NAL_RASL_R
@ HEVC_NAL_RASL_R
Definition: hevc.h:38
FFBitStreamFilter::p
AVBitStreamFilter p
The public AVBitStreamFilter.
Definition: bsf_internal.h:31
DTS2PTSFrame::poc_diff
int poc_diff
Definition: dts2pts.c:54
DTS2PTSFrame
Definition: dts2pts.c:51
dts2pts_codec_ids
static enum AVCodecID dts2pts_codec_ids[]
Definition: dts2pts.c:720
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:551
DTS2PTSContext::h264
DTS2PTSH264Context h264
Definition: dts2pts.c:88
AVFifo
Definition: fifo.c:35
hevc_filter
static int hevc_filter(AVBSFContext *ctx)
Definition: dts2pts.c:473
DTS2PTSH264Context::highest_poc
int highest_poc
Definition: dts2pts.c:63
HEVC_NAL_RASL_N
@ HEVC_NAL_RASL_N
Definition: hevc.h:37
free_node
static int free_node(void *opaque, void *elem)
Definition: dts2pts.c:124
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
DTS2PTSH264Context::last_poc
int last_poc
Definition: dts2pts.c:62
SPS::poc_cycle_length
int poc_cycle_length
num_ref_frames_in_pic_order_cnt_cycle
Definition: h264_ps.h:56
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
DTS2PTSNode::duration
int64_t duration
Definition: dts2pts.c:46
DTS2PTSContext::init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:79
DTS2PTSContext::gop
int gop
Definition: dts2pts.c:93
ps.h
DTS2PTSContext::hevc
DTS2PTSHEVCContext hevc
Definition: dts2pts.c:89
tree.h
header
static const uint8_t header[24]
Definition: sdr2.c:68
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:594
SPS::offset_for_top_to_bottom_field
int offset_for_top_to_bottom_field
Definition: h264_ps.h:55
attributes.h
DTS2PTSH264Context::picture_structure
int picture_structure
Definition: dts2pts.c:64
H264POCContext::frame_num
int frame_num
Definition: h264_parse.h:87
av_refstruct_unref
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
H264RawSliceHeader
Definition: cbs_h264.h:330
H265RawSliceHeader
Definition: cbs_h265.h:493
H264RawSlice::header
H264RawSliceHeader header
Definition: cbs_h264.h:409
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
SPS::log2_max_poc_lsb
int log2_max_poc_lsb
log2_max_pic_order_cnt_lsb_minus4
Definition: h264_ps.h:52
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
h264_filter
static int h264_filter(AVBSFContext *ctx)
Definition: dts2pts.c:237
dec_poc
static int dec_poc(void *opaque, void *elem)
Definition: dts2pts.c:116
H264POCContext
Definition: h264_parse.h:82
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
H265RawSliceHeader::nal_unit_header
H265RawNALUnitHeader nal_unit_header
Definition: cbs_h265.h:494
DTS2PTSContext::au
CodedBitstreamFragment au
Definition: dts2pts.c:85
ff_hevc_compute_poc2
int ff_hevc_compute_poc2(unsigned log2_max_poc_lsb, int pocTid0, int poc_lsb, int nal_unit_type)
Compute POC of the current frame and return it.
Definition: ps.c:2472
CodedBitstreamH265Context::active_sps
const H265RawSPS * active_sps
Definition: cbs_h265.h:764
cmp_insert
static int cmp_insert(const void *key, const void *node)
Definition: dts2pts.c:98
hevc_flush
static void hevc_flush(AVBSFContext *ctx)
Definition: dts2pts.c:391
ret
ret
Definition: filter_design.txt:187
ff_h264_init_poc
int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, const SPS *sps, H264POCContext *pc, int picture_structure, int nal_ref_idc)
Definition: h264_parse.c:280
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
H264_NAL_SLICE
@ H264_NAL_SLICE
Definition: h264.h:35
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
av_refstruct_pool_alloc
AVRefStructPool * av_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
Definition: refstruct.c:335
av_fifo_alloc2
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition: fifo.c:47
id
enum AVCodecID id
Definition: dts2pts.c:550
H264_NAL_SPS
@ H264_NAL_SPS
Definition: h264.h:41
HEVC_NAL_CRA_NUT
@ HEVC_NAL_CRA_NUT
Definition: hevc.h:50
AV_REFSTRUCT_POOL_FLAG_NO_ZEROING
#define AV_REFSTRUCT_POOL_FLAG_NO_ZEROING
If this flag is not set, every object in the pool will be zeroed before the init callback is called o...
Definition: refstruct.h:196
dts2pts_close
static void dts2pts_close(AVBSFContext *ctx)
Definition: dts2pts.c:708
CodedBitstreamH265Context::active_vps
const H265RawVPS * active_vps
Definition: cbs_h265.h:763
h264_decompose_unit_types
static const CodedBitstreamUnitType h264_decompose_unit_types[]
Definition: dts2pts.c:160
av_tree_find
void * av_tree_find(const AVTreeNode *t, void *key, int(*cmp)(const void *key, const void *b), void *next[2])
Definition: tree.c:39
hevc_queue_frame
static int hevc_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, bool *queued)
Definition: dts2pts.c:423
mem.h
DTS2PTSContext::eof
int eof
Definition: dts2pts.c:94
H264POCContext::poc_lsb
int poc_lsb
Definition: h264_parse.h:83
DTS2PTSContext::root
struct AVTreeNode * root
Definition: dts2pts.c:74
HEVC_NAL_RADL_R
@ HEVC_NAL_RADL_R
Definition: hevc.h:36
av_refstruct_pool_uninit
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition: refstruct.h:292
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
DTS2PTSNode::gop
int gop
Definition: dts2pts.c:48
AVPacket
This structure stores compressed data.
Definition: packet.h:572
hevc_init_nb_frame
static int hevc_init_nb_frame(AVBSFContext *ctx, int poc)
Definition: dts2pts.c:396
h264_queue_frame
static int h264_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, int *queued)
Definition: dts2pts.c:197
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
av_fifo_freep2
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition: fifo.c:286
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
H264POCContext::poc_msb
int poc_msb
Definition: h264_parse.h:84
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
H264POCContext::prev_poc_msb
int prev_poc_msb
poc_msb of the last reference pic for POC type 0
Definition: h264_parse.h:88
HEVC_NAL_RADL_N
@ HEVC_NAL_RADL_N
Definition: hevc.h:35
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1291
fifo_size
size_t fifo_size
Definition: dts2pts.c:554
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:160
duration
static int64_t duration
Definition: ffplay.c:329
SPS::log2_max_frame_num
int log2_max_frame_num
log2_max_frame_num_minus4 + 4
Definition: h264_ps.h:50
CodedBitstreamH265Context
Definition: cbs_h265.h:750
DTS2PTSHEVCContext::poc_tid0
int poc_tid0
Definition: dts2pts.c:69
HEVC_NAL_TRAIL_N
@ HEVC_NAL_TRAIL_N
Definition: hevc.h:29
H264RawSlice
Definition: cbs_h264.h:408
HEVC_NAL_BLA_W_LP
@ HEVC_NAL_BLA_W_LP
Definition: hevc.h:45
H264RawSPS
Definition: cbs_h264.h:102