FFmpeg
decklink_dec.cpp
Go to the documentation of this file.
1 /*
2  * Blackmagic DeckLink input
3  * Copyright (c) 2013-2014 Luca Barbato, Deti Fliegl
4  * Copyright (c) 2014 Rafaël Carré
5  * Copyright (c) 2017 Akamai Technologies, Inc.
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include <atomic>
25 #include <vector>
26 using std::atomic;
27 
28 /* Include internal.h first to avoid conflict between winsock.h (used by
29  * DeckLink headers) and winsock2.h (used by libavformat) in MSVC++ builds */
30 extern "C" {
31 #include "libavformat/internal.h"
32 }
33 
34 #include <DeckLinkAPIVersion.h>
35 #include <DeckLinkAPI.h>
36 #if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0e030000
37 #include <DeckLinkAPI_v14_2_1.h>
38 #endif
39 
40 extern "C" {
41 #include "config.h"
43 #include "libavformat/avformat.h"
44 #include "libavutil/avassert.h"
45 #include "libavutil/avutil.h"
46 #include "libavutil/common.h"
47 #include "libavutil/internal.h"
48 #include "libavutil/imgutils.h"
49 #include "libavutil/intreadwrite.h"
50 #include "libavutil/time.h"
51 #include "libavutil/timecode.h"
52 #include "libavutil/mathematics.h"
53 #include "libavutil/reverse.h"
54 #include "avdevice.h"
55 #if CONFIG_LIBZVBI
56 #include <libzvbi.h>
57 #endif
58 }
59 
60 #include "decklink_common.h"
61 #include "decklink_dec.h"
62 
63 #define MAX_WIDTH_VANC 1920
64 const BMDDisplayMode AUTODETECT_DEFAULT_MODE = bmdModeNTSC;
65 
66 typedef struct VANCLineNumber {
67  BMDDisplayMode mode;
71  int vanc_end;
73 
74 /* These VANC line numbers need not be very accurate. In any case
75  * GetBufferForVerticalBlankingLine() will return an error when invalid
76  * ancillary line number was requested. We just need to make sure that the
77  * entire VANC region is covered, while making sure we don't decode VANC of
78  * another source during switching*/
80  /* SD Modes */
81 
82  {bmdModeNTSC, 11, 19, 274, 282},
83  {bmdModeNTSC2398, 11, 19, 274, 282},
84  {bmdModePAL, 7, 22, 320, 335},
85  {bmdModeNTSCp, 11, -1, -1, 39},
86  {bmdModePALp, 7, -1, -1, 45},
87 
88  /* HD 1080 Modes */
89 
90  {bmdModeHD1080p2398, 8, -1, -1, 42},
91  {bmdModeHD1080p24, 8, -1, -1, 42},
92  {bmdModeHD1080p25, 8, -1, -1, 42},
93  {bmdModeHD1080p2997, 8, -1, -1, 42},
94  {bmdModeHD1080p30, 8, -1, -1, 42},
95  {bmdModeHD1080i50, 8, 20, 570, 585},
96  {bmdModeHD1080i5994, 8, 20, 570, 585},
97  {bmdModeHD1080i6000, 8, 20, 570, 585},
98  {bmdModeHD1080p50, 8, -1, -1, 42},
99  {bmdModeHD1080p5994, 8, -1, -1, 42},
100  {bmdModeHD1080p6000, 8, -1, -1, 42},
101 
102  /* HD 720 Modes */
103 
104  {bmdModeHD720p50, 8, -1, -1, 26},
105  {bmdModeHD720p5994, 8, -1, -1, 26},
106  {bmdModeHD720p60, 8, -1, -1, 26},
107 
108  /* For all other modes, for which we don't support VANC */
109  {bmdModeUnknown, 0, -1, -1, -1}
110 };
111 
113 {
114 public:
116  virtual ~decklink_allocator() { }
117 
118  // IDeckLinkMemoryAllocator methods
119  virtual HRESULT STDMETHODCALLTYPE AllocateBuffer(unsigned int bufferSize, void* *allocatedBuffer)
120  {
121  void *buf = av_malloc(bufferSize + AV_INPUT_BUFFER_PADDING_SIZE);
122  if (!buf)
123  return E_OUTOFMEMORY;
124  *allocatedBuffer = buf;
125  return S_OK;
126  }
127  virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer(void* buffer)
128  {
129  av_free(buffer);
130  return S_OK;
131  }
132  virtual HRESULT STDMETHODCALLTYPE Commit() { return S_OK; }
133  virtual HRESULT STDMETHODCALLTYPE Decommit() { return S_OK; }
134 
135  // IUnknown methods
136  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID *ppv)
137  {
138  if (DECKLINK_IsEqualIID(riid, IID_IUnknown)) {
139  *ppv = static_cast<IUnknown*>(this);
141  *ppv = static_cast<IDeckLinkMemoryAllocator_v14_2_1*>(this);
142  } else {
143  *ppv = NULL;
144  return E_NOINTERFACE;
145  }
146 
147  AddRef();
148  return S_OK;
149  }
150 
151  virtual ULONG STDMETHODCALLTYPE AddRef(void) { return ++_refs; }
152  virtual ULONG STDMETHODCALLTYPE Release(void)
153  {
154  int ret = --_refs;
155  if (!ret)
156  delete this;
157  return ret;
158  }
159 
160 private:
161  std::atomic<int> _refs;
162 };
163 
164 extern "C" {
165 static void decklink_object_free(void *opaque, uint8_t *data)
166 {
167  IUnknown *obj = (class IUnknown *)opaque;
168  obj->Release();
169 }
170 }
171 
172 static int get_vanc_line_idx(BMDDisplayMode mode)
173 {
174  unsigned int i;
175  for (i = 0; i < FF_ARRAY_ELEMS(vanc_line_numbers); i++) {
176  if (mode == vanc_line_numbers[i].mode)
177  return i;
178  }
179  /* Return the VANC idx for Unknown mode */
180  return i - 1;
181 }
182 
183 static inline void clear_parity_bits(uint16_t *buf, int len) {
184  int i;
185  for (i = 0; i < len; i++)
186  buf[i] &= 0xff;
187 }
188 
189 static int check_vanc_parity_checksum(uint16_t *buf, int len, uint16_t checksum) {
190  int i;
191  uint16_t vanc_sum = 0;
192  for (i = 3; i < len - 1; i++) {
193  uint16_t v = buf[i];
194  int np = v >> 8;
195  int p = av_parity(v & 0xff);
196  if ((!!p ^ !!(v & 0x100)) || (np != 1 && np != 2)) {
197  // Parity check failed
198  return -1;
199  }
200  vanc_sum += v;
201  }
202  vanc_sum &= 0x1ff;
203  vanc_sum |= ((~vanc_sum & 0x100) << 1);
204  if (checksum != vanc_sum) {
205  // Checksum verification failed
206  return -1;
207  }
208  return 0;
209 }
210 
211 /* The 10-bit VANC data is packed in V210, we only need the luma component. */
212 static void extract_luma_from_v210(uint16_t *dst, const uint8_t *src, int width)
213 {
214  int i;
215  for (i = 0; i < width / 3; i++) {
216  *dst++ = (src[1] >> 2) + ((src[2] & 15) << 6);
217  *dst++ = src[4] + ((src[5] & 3) << 8);
218  *dst++ = (src[6] >> 4) + ((src[7] & 63) << 4);
219  src += 8;
220  }
221 }
222 
223 static void unpack_v210(uint16_t *dst, const uint8_t *src, int width)
224 {
225  int i;
226  for (i = 0; i < width * 2 / 3; i++) {
227  *dst++ = src[0] + ((src[1] & 3) << 8);
228  *dst++ = (src[1] >> 2) + ((src[2] & 15) << 6);
229  *dst++ = (src[2] >> 4) + ((src[3] & 63) << 4);
230  src += 4;
231  }
232 }
233 
235 {
236  uint8_t ret = (line < 313) << 5;
237  if (line >= 7 && line <= 22)
238  ret += line;
239  if (line >= 320 && line <= 335)
240  ret += (line - 313);
241  return ret;
242 }
243 
244 static void fill_data_unit_head(int line, uint8_t *tgt)
245 {
246  tgt[0] = 0x02; // data_unit_id
247  tgt[1] = 0x2c; // data_unit_length
248  tgt[2] = calc_parity_and_line_offset(line); // field_parity, line_offset
249  tgt[3] = 0xe4; // framing code
250 }
251 
252 #if CONFIG_LIBZVBI
253 static uint8_t* teletext_data_unit_from_vbi_data(int line, uint8_t *src, uint8_t *tgt, vbi_pixfmt fmt)
254 {
255  vbi_bit_slicer slicer;
256 
257  vbi_bit_slicer_init(&slicer, 720, 13500000, 6937500, 6937500, 0x00aaaae4, 0xffff, 18, 6, 42 * 8, VBI_MODULATION_NRZ_MSB, fmt);
258 
259  if (vbi_bit_slice(&slicer, src, tgt + 4) == FALSE)
260  return tgt;
261 
263 
264  return tgt + 46;
265 }
266 
267 static uint8_t* teletext_data_unit_from_vbi_data_10bit(int line, uint8_t *src, uint8_t *tgt)
268 {
269  uint8_t y[720];
270  uint8_t *py = y;
271  uint8_t *pend = y + 720;
272  /* The 10-bit VBI data is packed in V210, but libzvbi only supports 8-bit,
273  * so we extract the 8 MSBs of the luma component, that is enough for
274  * teletext bit slicing. */
275  while (py < pend) {
276  *py++ = (src[1] >> 4) + ((src[2] & 15) << 4);
277  *py++ = (src[4] >> 2) + ((src[5] & 3 ) << 6);
278  *py++ = (src[6] >> 6) + ((src[7] & 63) << 2);
279  src += 8;
280  }
281  return teletext_data_unit_from_vbi_data(line, y, tgt, VBI_PIXFMT_YUV420);
282 }
283 #endif
284 
285 static uint8_t* teletext_data_unit_from_op47_vbi_packet(int line, uint16_t *py, uint8_t *tgt)
286 {
287  int i;
288 
289  if (py[0] != 0x255 || py[1] != 0x255 || py[2] != 0x227)
290  return tgt;
291 
293 
294  py += 3;
295  tgt += 4;
296 
297  for (i = 0; i < 42; i++)
298  *tgt++ = ff_reverse[py[i] & 255];
299 
300  return tgt;
301 }
302 
304 {
305  int shift = -1;
306  if (line >= 6 && line <= 22)
307  shift = line - 6;
308  if (line >= 318 && line <= 335)
309  shift = line - 318 + 17;
310  return shift >= 0 && ((1ULL << shift) & mask);
311 }
312 
313 static uint8_t* teletext_data_unit_from_op47_data(uint16_t *py, uint16_t *pend, uint8_t *tgt, int64_t wanted_lines)
314 {
315  if (py < pend - 9) {
316  if (py[0] == 0x151 && py[1] == 0x115 && py[3] == 0x102) { // identifier, identifier, format code for WST teletext
317  uint16_t *descriptors = py + 4;
318  int i;
319  py += 9;
320  for (i = 0; i < 5 && py < pend - 45; i++, py += 45) {
321  int line = (descriptors[i] & 31) + (!(descriptors[i] & 128)) * 313;
322  if (line && linemask_matches(line, wanted_lines))
324  }
325  }
326  }
327  return tgt;
328 }
329 
330 static uint8_t* teletext_data_unit_from_ancillary_packet(uint16_t *py, uint16_t *pend, uint8_t *tgt, int64_t wanted_lines, int allow_multipacket)
331 {
332  uint16_t did = py[0]; // data id
333  uint16_t sdid = py[1]; // secondary data id
334  uint16_t dc = py[2] & 255; // data count
335  py += 3;
336  pend = FFMIN(pend, py + dc);
337  if (did == 0x143 && sdid == 0x102) { // subtitle distribution packet
338  tgt = teletext_data_unit_from_op47_data(py, pend, tgt, wanted_lines);
339  } else if (allow_multipacket && did == 0x143 && sdid == 0x203) { // VANC multipacket
340  py += 2; // priority, line/field
341  while (py < pend - 3) {
342  tgt = teletext_data_unit_from_ancillary_packet(py, pend, tgt, wanted_lines, 0);
343  py += 4 + (py[2] & 255); // ndid, nsdid, ndc, line/field
344  }
345  }
346  return tgt;
347 }
348 
349 static uint8_t *vanc_to_cc(AVFormatContext *avctx, uint16_t *buf, size_t words,
350  unsigned &cc_count)
351 {
352  size_t i, len = (buf[5] & 0xff) + 6 + 1;
353  uint8_t cdp_sum, rate;
354  uint16_t hdr, ftr;
355  uint8_t *cc;
356  uint16_t *cdp = &buf[6]; // CDP follows
357  if (cdp[0] != 0x96 || cdp[1] != 0x69) {
358  av_log(avctx, AV_LOG_WARNING, "Invalid CDP header 0x%.2x 0x%.2x\n", cdp[0], cdp[1]);
359  return NULL;
360  }
361 
362  len -= 7; // remove VANC header and checksum
363 
364  if (cdp[2] != len) {
365  av_log(avctx, AV_LOG_WARNING, "CDP len %d != %zu\n", cdp[2], len);
366  return NULL;
367  }
368 
369  cdp_sum = 0;
370  for (i = 0; i < len - 1; i++)
371  cdp_sum += cdp[i];
372  cdp_sum = cdp_sum ? 256 - cdp_sum : 0;
373  if (cdp[len - 1] != cdp_sum) {
374  av_log(avctx, AV_LOG_WARNING, "CDP checksum invalid 0x%.4x != 0x%.4x\n", cdp_sum, cdp[len-1]);
375  return NULL;
376  }
377 
378  rate = cdp[3];
379  if (!(rate & 0x0f)) {
380  av_log(avctx, AV_LOG_WARNING, "CDP frame rate invalid (0x%.2x)\n", rate);
381  return NULL;
382  }
383  rate >>= 4;
384  if (rate > 8) {
385  av_log(avctx, AV_LOG_WARNING, "CDP frame rate invalid (0x%.2x)\n", rate);
386  return NULL;
387  }
388 
389  if (!(cdp[4] & 0x43)) /* ccdata_present | caption_service_active | reserved */ {
390  av_log(avctx, AV_LOG_WARNING, "CDP flags invalid (0x%.2x)\n", cdp[4]);
391  return NULL;
392  }
393 
394  hdr = (cdp[5] << 8) | cdp[6];
395  if (cdp[7] != 0x72) /* ccdata_id */ {
396  av_log(avctx, AV_LOG_WARNING, "Invalid ccdata_id 0x%.2x\n", cdp[7]);
397  return NULL;
398  }
399 
400  cc_count = cdp[8];
401  if (!(cc_count & 0xe0)) {
402  av_log(avctx, AV_LOG_WARNING, "Invalid cc_count 0x%.2x\n", cc_count);
403  return NULL;
404  }
405 
406  cc_count &= 0x1f;
407  if ((len - 13) < cc_count * 3) {
408  av_log(avctx, AV_LOG_WARNING, "Invalid cc_count %d (> %zu)\n", cc_count * 3, len - 13);
409  return NULL;
410  }
411 
412  if (cdp[len - 4] != 0x74) /* footer id */ {
413  av_log(avctx, AV_LOG_WARNING, "Invalid footer id 0x%.2x\n", cdp[len-4]);
414  return NULL;
415  }
416 
417  ftr = (cdp[len - 3] << 8) | cdp[len - 2];
418  if (ftr != hdr) {
419  av_log(avctx, AV_LOG_WARNING, "Header 0x%.4x != Footer 0x%.4x\n", hdr, ftr);
420  return NULL;
421  }
422 
423  cc = (uint8_t *)av_malloc(cc_count * 3);
424  if (cc == NULL) {
425  av_log(avctx, AV_LOG_WARNING, "CC - av_malloc failed for cc_count = %d\n", cc_count);
426  return NULL;
427  }
428 
429  for (size_t i = 0; i < cc_count; i++) {
430  cc[3*i + 0] = cdp[9 + 3*i+0] /* & 3 */;
431  cc[3*i + 1] = cdp[9 + 3*i+1];
432  cc[3*i + 2] = cdp[9 + 3*i+2];
433  }
434 
435  cc_count *= 3;
436  return cc;
437 }
438 
439 static uint8_t *get_metadata(AVFormatContext *avctx, uint16_t *buf, size_t width,
440  uint8_t *tgt, size_t tgt_size, AVPacket *pkt)
441 {
442  decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data;
443  uint16_t *max_buf = buf + width;
444 
445  while (buf < max_buf - 6) {
446  int len;
447  uint16_t did = buf[3] & 0xFF; // data id
448  uint16_t sdid = buf[4] & 0xFF; // secondary data id
449  /* Check for VANC header */
450  if (buf[0] != 0 || buf[1] != 0x3ff || buf[2] != 0x3ff) {
451  return tgt;
452  }
453 
454  len = (buf[5] & 0xff) + 6 + 1;
455  if (len > max_buf - buf) {
456  av_log(avctx, AV_LOG_WARNING, "Data Count (%d) > data left (%zu)\n",
457  len, max_buf - buf);
458  return tgt;
459  }
460 
461  if (did == 0x43 && (sdid == 0x02 || sdid == 0x03) && cctx->teletext_lines &&
462  width == 1920 && tgt_size >= 1920) {
463  if (check_vanc_parity_checksum(buf, len, buf[len - 1]) < 0) {
464  av_log(avctx, AV_LOG_WARNING, "VANC parity or checksum incorrect\n");
465  goto skip_packet;
466  }
467  tgt = teletext_data_unit_from_ancillary_packet(buf + 3, buf + len, tgt, cctx->teletext_lines, 1);
468  } else if (did == 0x61 && sdid == 0x01) {
469  unsigned int data_len;
470  uint8_t *data;
471  if (check_vanc_parity_checksum(buf, len, buf[len - 1]) < 0) {
472  av_log(avctx, AV_LOG_WARNING, "VANC parity or checksum incorrect\n");
473  goto skip_packet;
474  }
475  clear_parity_bits(buf, len);
476  data = vanc_to_cc(avctx, buf, width, data_len);
477  if (data) {
478  if (av_packet_add_side_data(pkt, AV_PKT_DATA_A53_CC, data, data_len) < 0)
479  av_free(data);
480  }
481  } else {
482  av_log(avctx, AV_LOG_DEBUG, "Unknown meta data DID = 0x%.2x SDID = 0x%.2x\n",
483  did, sdid);
484  }
485 skip_packet:
486  buf += len;
487  }
488 
489  return tgt;
490 }
491 
492 
494 {
495  const uint8_t KLV_DID = 0x44;
496  const uint8_t KLV_IN_VANC_SDID = 0x04;
497 
498  struct KLVPacket
499  {
500  uint16_t sequence_counter;
501  std::vector<uint8_t> data;
502  };
503 
504  size_t total_size = 0;
505  std::vector<std::vector<KLVPacket>> klv_packets(256);
506 
507  IDeckLinkVideoFrameAncillaryPackets *packets = nullptr;
508  if (videoFrame->QueryInterface(IID_IDeckLinkVideoFrameAncillaryPackets, (void**)&packets) != S_OK)
509  return;
510 
511  IDeckLinkAncillaryPacketIterator *it = nullptr;
512  if (packets->GetPacketIterator(&it) != S_OK) {
513  packets->Release();
514  return;
515  }
516 
517  IDeckLinkAncillaryPacket *packet = nullptr;
518  while (it->Next(&packet) == S_OK) {
519  uint8_t *data = nullptr;
520  uint32_t size = 0;
521 
522  if (packet->GetDID() == KLV_DID && packet->GetSDID() == KLV_IN_VANC_SDID) {
523  av_log(avctx, AV_LOG_DEBUG, "Found KLV VANC packet on line: %d\n", packet->GetLineNumber());
524 
525  if (packet->GetBytes(bmdAncillaryPacketFormatUInt8, (const void**) &data, &size) == S_OK) {
526  // MID and PSC
527  if (size > 3) {
528  uint8_t mid = data[0];
529  uint16_t psc = data[1] << 8 | data[2];
530 
531  av_log(avctx, AV_LOG_DEBUG, "KLV with MID: %d and PSC: %d\n", mid, psc);
532 
533  auto& list = klv_packets[mid];
534  uint16_t expected_psc = list.size() + 1;
535 
536  if (psc == expected_psc) {
537  uint32_t data_len = size - 3;
538  total_size += data_len;
539 
540  KLVPacket packet{ psc };
541  packet.data.resize(data_len);
542  memcpy(packet.data.data(), data + 3, data_len);
543 
544  list.push_back(std::move(packet));
545  } else {
546  av_log(avctx, AV_LOG_WARNING, "Out of order PSC: %d for MID: %d\n", psc, mid);
547 
548  if (!list.empty()) {
549  for (auto& klv : list)
550  total_size -= klv.data.size();
551 
552  list.clear();
553  }
554  }
555  }
556  }
557  }
558 
559  packet->Release();
560  }
561 
562  it->Release();
563  packets->Release();
564 
565  if (total_size > 0) {
566  std::vector<uint8_t> klv;
567  klv.reserve(total_size);
568 
569  for (size_t i = 0; i < klv_packets.size(); ++i) {
570  auto& list = klv_packets[i];
571 
572  if (list.empty())
573  continue;
574 
575  av_log(avctx, AV_LOG_DEBUG, "Joining MID: %d\n", (int)i);
576 
577  for (auto& packet : list)
578  klv.insert(klv.end(), packet.data.begin(), packet.data.end());
579  }
580 
581  AVPacket klv_packet = { 0 };
582  klv_packet.pts = pts;
583  klv_packet.dts = pts;
584  klv_packet.flags |= AV_PKT_FLAG_KEY;
585  klv_packet.stream_index = ctx->klv_st->index;
586  klv_packet.data = klv.data();
587  klv_packet.size = klv.size();
588 
589  if (ff_decklink_packet_queue_put(&ctx->queue, &klv_packet) < 0) {
590  ++ctx->dropped;
591  }
592  }
593 }
594 
596 {
597 public:
598  explicit decklink_input_callback(AVFormatContext *_avctx);
600 
601  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID *ppv)
602  {
603  if (DECKLINK_IsEqualIID(riid, IID_IUnknown)) {
604  *ppv = static_cast<IUnknown*>(this);
606  *ppv = static_cast<IDeckLinkInputCallback_v14_2_1*>(this);
607  } else {
608  *ppv = NULL;
609  return E_NOINTERFACE;
610  }
611 
612  AddRef();
613  return S_OK;
614  }
615  virtual ULONG STDMETHODCALLTYPE AddRef(void);
616  virtual ULONG STDMETHODCALLTYPE Release(void);
617  virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents, IDeckLinkDisplayMode*, BMDDetectedVideoInputFormatFlags);
618  virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(IDeckLinkVideoInputFrame_v14_2_1*, IDeckLinkAudioInputPacket*);
619 
620 private:
621  std::atomic<int> _refs;
624  int no_video;
628 };
629 
631 {
632  avctx = _avctx;
633  decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
634  ctx = (struct decklink_ctx *)cctx->ctx;
635  no_video = 0;
637  last_video_frame = nullptr;
638 }
639 
641 {
642  if (last_video_frame)
643  last_video_frame->Release();
644 }
645 
647 {
648  return ++_refs;
649 }
650 
652 {
653  int ret = --_refs;
654  if (!ret)
655  delete this;
656  return ret;
657 }
658 
660  IDeckLinkAudioInputPacket *audioFrame,
661  int64_t wallclock,
662  int64_t abs_wallclock,
663  DecklinkPtsSource pts_src,
664  AVRational time_base, int64_t *initial_pts,
665  int copyts)
666 {
668  BMDTimeValue bmd_pts;
669  BMDTimeValue bmd_duration;
670  HRESULT res = E_INVALIDARG;
671  switch (pts_src) {
672  case PTS_SRC_AUDIO:
673  if (audioFrame)
674  res = audioFrame->GetPacketTime(&bmd_pts, time_base.den);
675  break;
676  case PTS_SRC_VIDEO:
677  if (videoFrame)
678  res = videoFrame->GetStreamTime(&bmd_pts, &bmd_duration, time_base.den);
679  break;
680  case PTS_SRC_REFERENCE:
681  if (videoFrame)
682  res = videoFrame->GetHardwareReferenceTimestamp(time_base.den, &bmd_pts, &bmd_duration);
683  break;
684  case PTS_SRC_WALLCLOCK:
685  /* fall through */
687  {
688  /* MSVC does not support compound literals like AV_TIME_BASE_Q
689  * in C++ code (compiler error C4576) */
690  AVRational timebase;
691  timebase.num = 1;
692  timebase.den = AV_TIME_BASE;
693  if (pts_src == PTS_SRC_WALLCLOCK)
694  pts = av_rescale_q(wallclock, timebase, time_base);
695  else
696  pts = av_rescale_q(abs_wallclock, timebase, time_base);
697  break;
698  }
699  }
700  if (res == S_OK)
701  pts = bmd_pts / time_base.num;
702 
703  if (!copyts) {
704  if (pts != AV_NOPTS_VALUE && *initial_pts == AV_NOPTS_VALUE)
705  *initial_pts = pts;
706  if (*initial_pts != AV_NOPTS_VALUE)
707  pts -= *initial_pts;
708  }
709 
710  return pts;
711 }
712 
713 static int get_bmd_timecode(AVFormatContext *avctx, AVTimecode *tc, AVRational frame_rate, BMDTimecodeFormat tc_format, IDeckLinkVideoInputFrame_v14_2_1 *videoFrame)
714 {
715  IDeckLinkTimecode *timecode;
716  int ret = AVERROR(ENOENT);
717 #if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
718  int hfr = (tc_format == bmdTimecodeRP188HighFrameRate);
719 #else
720  int hfr = 0;
721 #endif
722  if (videoFrame->GetTimecode(tc_format, &timecode) == S_OK) {
723  uint8_t hh, mm, ss, ff;
724  if (timecode->GetComponents(&hh, &mm, &ss, &ff) == S_OK) {
725  int flags = (timecode->GetFlags() & bmdTimecodeIsDropFrame) ? AV_TIMECODE_FLAG_DROPFRAME : 0;
726  if (!hfr && av_cmp_q(frame_rate, av_make_q(30, 1)) == 1)
727  ff = ff << 1 | !!(timecode->GetFlags() & bmdTimecodeFieldMark);
728  ret = av_timecode_init_from_components(tc, frame_rate, flags, hh, mm, ss, ff, avctx);
729  }
730  timecode->Release();
731  }
732  return ret;
733 }
734 
736 {
737  AVRational frame_rate = ctx->video_st->r_frame_rate;
738  int ret;
739  /* 50/60 fps content has alternating VITC1 and VITC2 timecode (see SMPTE ST
740  * 12-2, section 7), so the native ordering of RP188Any (HFR, VITC1, LTC,
741  * VITC2) would not work because LTC might not contain the field flag.
742  * Therefore we query the types manually. */
743  if (ctx->tc_format == bmdTimecodeRP188Any && av_cmp_q(frame_rate, av_make_q(30, 1)) == 1) {
744 #if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
745  ret = get_bmd_timecode(avctx, tc, frame_rate, bmdTimecodeRP188HighFrameRate, videoFrame);
746  if (ret == AVERROR(ENOENT))
747 #endif
748  ret = get_bmd_timecode(avctx, tc, frame_rate, bmdTimecodeRP188VITC1, videoFrame);
749  if (ret == AVERROR(ENOENT))
750  ret = get_bmd_timecode(avctx, tc, frame_rate, bmdTimecodeRP188VITC2, videoFrame);
751  if (ret == AVERROR(ENOENT))
752  ret = get_bmd_timecode(avctx, tc, frame_rate, bmdTimecodeRP188LTC, videoFrame);
753  } else {
754  ret = get_bmd_timecode(avctx, tc, frame_rate, ctx->tc_format, videoFrame);
755  }
756  return ret;
757 }
758 
760  IDeckLinkVideoInputFrame_v14_2_1 *videoFrame, IDeckLinkAudioInputPacket *audioFrame)
761 {
762  void *frameBytes;
763  void *audioFrameBytes;
764  BMDTimeValue frameTime;
765  BMDTimeValue frameDuration;
766  int64_t wallclock = 0, abs_wallclock = 0;
767  int64_t video_pkt_pts, audio_pkt_pts;
768  struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data;
769 
770  if (ctx->autodetect) {
771  if (videoFrame && !(videoFrame->GetFlags() & bmdFrameHasNoInputSource) &&
772  ctx->bmd_mode == bmdModeUnknown)
773  {
775  }
776  return S_OK;
777  }
778 
779  // Drop the frames till system's timestamp aligns with the configured value.
780  if (0 == ctx->frameCount && cctx->timestamp_align) {
781  AVRational remainder = av_make_q(av_gettime() % cctx->timestamp_align, 1000000);
782  AVRational frame_duration = av_inv_q(ctx->video_st->r_frame_rate);
783  if (av_cmp_q(remainder, frame_duration) > 0) {
784  ++ctx->dropped;
785  return S_OK;
786  }
787  }
788 
789  ctx->frameCount++;
791  wallclock = av_gettime_relative();
793  abs_wallclock = av_gettime();
794  video_pkt_pts = get_pkt_pts(videoFrame, audioFrame, wallclock, abs_wallclock, ctx->video_pts_source, ctx->video_st->time_base, &initial_video_pts, cctx->copyts);
795  audio_pkt_pts = get_pkt_pts(videoFrame, audioFrame, wallclock, abs_wallclock, ctx->audio_pts_source, ctx->audio_st->time_base, &initial_audio_pts, cctx->copyts);
796 
797  // Handle Video Frame
798  if (videoFrame) {
799  AVPacket pkt = { 0 };
800  if (ctx->frameCount % 25 == 0) {
801  unsigned long long qsize = ff_decklink_packet_queue_size(&ctx->queue);
803  "Frame received (#%lu) - Valid (%liB) - QSize %fMB\n",
804  ctx->frameCount,
805  videoFrame->GetRowBytes() * videoFrame->GetHeight(),
806  (double)qsize / 1024 / 1024);
807  }
808 
809  videoFrame->GetBytes(&frameBytes);
810  videoFrame->GetStreamTime(&frameTime, &frameDuration,
812 
813  if (videoFrame->GetFlags() & bmdFrameHasNoInputSource) {
814  if (ctx->signal_loss_action == SIGNAL_LOSS_BARS && videoFrame->GetPixelFormat() == bmdFormat8BitYUV) {
815  unsigned bars[8] = {
816  0xEA80EA80, 0xD292D210, 0xA910A9A5, 0x90229035,
817  0x6ADD6ACA, 0x51EF515A, 0x286D28EF, 0x10801080 };
818  int width = videoFrame->GetWidth();
819  int height = videoFrame->GetHeight();
820  unsigned *p = (unsigned *)frameBytes;
821 
822  for (int y = 0; y < height; y++) {
823  for (int x = 0; x < width; x += 2)
824  *p++ = bars[(x * 8) / width];
825  }
827  videoFrame = last_video_frame;
828  videoFrame->GetBytes(&frameBytes);
829  }
830 
831  if (!no_video) {
832  av_log(avctx, AV_LOG_WARNING, "Frame received (#%lu) - No input signal detected "
833  "- Frames dropped %u\n", ctx->frameCount, ++ctx->dropped);
834  }
835  no_video = 1;
836  } else {
838  if (last_video_frame)
839  last_video_frame->Release();
840  last_video_frame = videoFrame;
841  last_video_frame->AddRef();
842  }
843  if (no_video) {
844  av_log(avctx, AV_LOG_WARNING, "Frame received (#%lu) - Input returned "
845  "- Frames dropped %u\n", ctx->frameCount, ++ctx->dropped);
846  }
847  no_video = 0;
848 
849  // Handle Timecode (if requested)
850  if (ctx->tc_format) {
851  AVTimecode tcr;
852  if (get_frame_timecode(avctx, ctx, &tcr, videoFrame) >= 0) {
853  char tcstr[AV_TIMECODE_STR_SIZE];
854  const char *tc = av_timecode_make_string(&tcr, tcstr, 0);
855  if (tc) {
856  AVDictionary* metadata_dict = NULL;
857  uint8_t* packed_metadata;
858 
859  if (av_cmp_q(ctx->video_st->r_frame_rate, av_make_q(60, 1)) < 1) {
860  uint32_t tc_data = av_timecode_get_smpte_from_framenum(&tcr, 0);
861  int size = sizeof(uint32_t) * 4;
862  uint32_t *sd = (uint32_t *)av_packet_new_side_data(&pkt, AV_PKT_DATA_S12M_TIMECODE, size);
863 
864  if (sd) {
865  *sd = 1; // one TC
866  *(sd + 1) = tc_data; // TC
867  }
868  }
869 
870  if (av_dict_set(&metadata_dict, "timecode", tc, 0) >= 0) {
871  size_t metadata_len;
872  packed_metadata = av_packet_pack_dictionary(metadata_dict, &metadata_len);
873  av_dict_free(&metadata_dict);
874  if (packed_metadata) {
875  if (av_packet_add_side_data(&pkt, AV_PKT_DATA_STRINGS_METADATA, packed_metadata, metadata_len) < 0)
876  av_freep(&packed_metadata);
877  else if (!ctx->tc_seen)
879  }
880  }
881  }
882  } else {
883  av_log(avctx, AV_LOG_DEBUG, "Unable to find timecode.\n");
884  }
885  }
886  }
887 
888  if (ctx->tc_format && cctx->wait_for_tc && !ctx->tc_seen) {
889 
890  av_log(avctx, AV_LOG_WARNING, "No TC detected yet. wait_for_tc set. Dropping. \n");
891  av_log(avctx, AV_LOG_WARNING, "Frame received (#%lu) - "
892  "- Frames dropped %u\n", ctx->frameCount, ++ctx->dropped);
893  return S_OK;
894  }
895 
896  pkt.pts = video_pkt_pts;
897  pkt.dts = pkt.pts;
898 
899  pkt.duration = frameDuration;
900  //To be made sure it still applies
903  pkt.data = (uint8_t *)frameBytes;
904  pkt.size = videoFrame->GetRowBytes() *
905  videoFrame->GetHeight();
906  //fprintf(stderr,"Video Frame size %d ts %d\n", pkt.size, pkt.pts);
907 
908  if (!no_video) {
909  IDeckLinkVideoFrameAncillary *vanc;
910  AVPacket txt_pkt = { 0 };
911  uint8_t txt_buf0[3531]; // 35 * 46 bytes decoded teletext lines + 1 byte data_identifier + 1920 bytes OP47 decode buffer
912  uint8_t *txt_buf = txt_buf0;
913 
914  if (ctx->enable_klv) {
915  handle_klv(avctx, ctx, videoFrame, pkt.pts);
916  }
917 
918  if (videoFrame->GetAncillaryData(&vanc) == S_OK) {
919  int i;
920  BMDPixelFormat vanc_format = vanc->GetPixelFormat();
921  txt_buf[0] = 0x10; // data_identifier - EBU_data
922  txt_buf++;
923 #if CONFIG_LIBZVBI
924  if (ctx->bmd_mode == bmdModePAL && ctx->teletext_lines &&
925  (vanc_format == bmdFormat8BitYUV || vanc_format == bmdFormat10BitYUV)) {
926  int64_t line_mask = 1;
927  av_assert0(videoFrame->GetWidth() == 720);
928  for (i = 6; i < 336; i++, line_mask <<= 1) {
929  uint8_t *buf;
930  if ((ctx->teletext_lines & line_mask) && vanc->GetBufferForVerticalBlankingLine(i, (void**)&buf) == S_OK) {
931  if (vanc_format == bmdFormat8BitYUV)
932  txt_buf = teletext_data_unit_from_vbi_data(i, buf, txt_buf, VBI_PIXFMT_UYVY);
933  else
934  txt_buf = teletext_data_unit_from_vbi_data_10bit(i, buf, txt_buf);
935  }
936  if (i == 22)
937  i = 317;
938  }
939  }
940 #endif
941  if (vanc_format == bmdFormat10BitYUV && videoFrame->GetWidth() <= MAX_WIDTH_VANC) {
942  int idx = get_vanc_line_idx(ctx->bmd_mode);
943  for (i = vanc_line_numbers[idx].vanc_start; i <= vanc_line_numbers[idx].vanc_end; i++) {
944  uint8_t *buf;
945  if (vanc->GetBufferForVerticalBlankingLine(i, (void**)&buf) == S_OK) {
946  uint16_t vanc[MAX_WIDTH_VANC];
947  size_t vanc_size = videoFrame->GetWidth();
948  if (ctx->bmd_mode == bmdModeNTSC && videoFrame->GetWidth() * 2 <= MAX_WIDTH_VANC) {
949  vanc_size = vanc_size * 2;
950  unpack_v210(vanc, buf, videoFrame->GetWidth());
951  } else {
952  extract_luma_from_v210(vanc, buf, videoFrame->GetWidth());
953  }
954  txt_buf = get_metadata(avctx, vanc, vanc_size,
955  txt_buf, sizeof(txt_buf0) - (txt_buf - txt_buf0), &pkt);
956  }
957  if (i == vanc_line_numbers[idx].field0_vanc_end)
959  }
960  }
961  vanc->Release();
962  if (txt_buf - txt_buf0 > 1) {
963  int stuffing_units = (4 - ((45 + txt_buf - txt_buf0) / 46) % 4) % 4;
964  while (stuffing_units--) {
965  memset(txt_buf, 0xff, 46);
966  txt_buf[1] = 0x2c; // data_unit_length
967  txt_buf += 46;
968  }
969  txt_pkt.pts = pkt.pts;
970  txt_pkt.dts = pkt.dts;
971  txt_pkt.stream_index = ctx->teletext_st->index;
972  txt_pkt.data = txt_buf0;
973  txt_pkt.size = txt_buf - txt_buf0;
974  if (ff_decklink_packet_queue_put(&ctx->queue, &txt_pkt) < 0) {
975  ++ctx->dropped;
976  }
977  }
978  }
979  }
980 
982  if (pkt.buf)
983  videoFrame->AddRef();
984 
985  if (ff_decklink_packet_queue_put(&ctx->queue, &pkt) < 0) {
986  ++ctx->dropped;
987  }
988  }
989 
990  // Handle Audio Frame
991  if (audioFrame) {
992  AVPacket pkt = { 0 };
993  BMDTimeValue audio_pts;
994 
995  //hack among hacks
996  pkt.size = audioFrame->GetSampleFrameCount() * ctx->audio_st->codecpar->ch_layout.nb_channels * (ctx->audio_depth / 8);
997  audioFrame->GetBytes(&audioFrameBytes);
998  audioFrame->GetPacketTime(&audio_pts, ctx->audio_st->time_base.den);
999  pkt.pts = audio_pkt_pts;
1000  pkt.dts = pkt.pts;
1001 
1002  //fprintf(stderr,"Audio Frame size %d ts %d\n", pkt.size, pkt.pts);
1005  pkt.data = (uint8_t *)audioFrameBytes;
1006 
1007  if (ff_decklink_packet_queue_put(&ctx->queue, &pkt) < 0) {
1008  ++ctx->dropped;
1009  }
1010  }
1011 
1012  return S_OK;
1013 }
1014 
1016  BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode *mode,
1017  BMDDetectedVideoInputFormatFlags formatFlags)
1018 {
1019  struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data;
1020  ctx->bmd_mode = mode->GetDisplayMode();
1021  // check the C context member to make sure we set both raw_format and bmd_mode with data from the same format change callback
1022  if (!cctx->raw_format)
1023  ctx->raw_format = (formatFlags & bmdDetectedVideoInputRGB444) ? bmdFormat8BitARGB : bmdFormat8BitYUV;
1024  return S_OK;
1025 }
1026 
1027 static int decklink_autodetect(struct decklink_cctx *cctx) {
1028  struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
1029  DECKLINK_BOOL autodetect_supported = false;
1030  int i;
1031 
1032  if (ctx->attr->GetFlag(BMDDeckLinkSupportsInputFormatDetection, &autodetect_supported) != S_OK)
1033  return -1;
1034  if (autodetect_supported == false)
1035  return -1;
1036 
1037  ctx->autodetect = 1;
1038  ctx->bmd_mode = bmdModeUnknown;
1039  if (ctx->dli->EnableVideoInput(AUTODETECT_DEFAULT_MODE,
1040  bmdFormat8BitYUV,
1041  bmdVideoInputEnableFormatDetection) != S_OK) {
1042  return -1;
1043  }
1044 
1045  if (ctx->dli->StartStreams() != S_OK) {
1046  return -1;
1047  }
1048 
1049  // 3 second timeout
1050  for (i = 0; i < 30; i++) {
1051  av_usleep(100000);
1052  /* Sometimes VideoInputFrameArrived is called without the
1053  * bmdFrameHasNoInputSource flag before VideoInputFormatChanged.
1054  * So don't break for bmd_mode == AUTODETECT_DEFAULT_MODE. */
1055  if (ctx->bmd_mode != bmdModeUnknown &&
1056  ctx->bmd_mode != AUTODETECT_DEFAULT_MODE)
1057  break;
1058  }
1059 
1060  ctx->dli->PauseStreams();
1061  ctx->dli->FlushStreams();
1062  ctx->autodetect = 0;
1063  if (ctx->bmd_mode != bmdModeUnknown) {
1064  cctx->format_code = (char *)av_mallocz(5);
1065  if (!cctx->format_code)
1066  return -1;
1067  AV_WB32(cctx->format_code, ctx->bmd_mode);
1068  return 0;
1069  } else {
1070  return -1;
1071  }
1072 
1073 }
1074 
1075 extern "C" {
1076 
1078 {
1079  struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
1080  struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
1081 
1082  if (ctx->dli) {
1083  ctx->dli->StopStreams();
1084  ctx->dli->DisableVideoInput();
1085  ctx->dli->DisableAudioInput();
1086  ctx->dli->SetCallback(nullptr);
1087  }
1088 
1089  ff_decklink_cleanup(avctx);
1091 
1092  av_freep(&cctx->ctx);
1093 
1094  return 0;
1095 }
1096 
1098 {
1099  struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
1100  struct decklink_ctx *ctx;
1101  class decklink_allocator *allocator;
1103  AVStream *st;
1104  HRESULT result;
1105  int ret;
1106 
1107  ctx = (struct decklink_ctx *) av_mallocz(sizeof(struct decklink_ctx));
1108  if (!ctx)
1109  return AVERROR(ENOMEM);
1110  ctx->list_devices = cctx->list_devices;
1111  ctx->list_formats = cctx->list_formats;
1112  ctx->enable_klv = cctx->enable_klv;
1113  ctx->teletext_lines = cctx->teletext_lines;
1114  ctx->preroll = cctx->preroll;
1115  ctx->duplex_mode = cctx->duplex_mode;
1116  if (cctx->tc_format > 0 && (unsigned int)cctx->tc_format < FF_ARRAY_ELEMS(decklink_timecode_format_map))
1117  ctx->tc_format = decklink_timecode_format_map[cctx->tc_format];
1118  if (cctx->video_input > 0 && (unsigned int)cctx->video_input < FF_ARRAY_ELEMS(decklink_video_connection_map))
1119  ctx->video_input = decklink_video_connection_map[cctx->video_input];
1120  if (cctx->audio_input > 0 && (unsigned int)cctx->audio_input < FF_ARRAY_ELEMS(decklink_audio_connection_map))
1121  ctx->audio_input = decklink_audio_connection_map[cctx->audio_input];
1122  ctx->audio_pts_source = cctx->audio_pts_source;
1123  ctx->video_pts_source = cctx->video_pts_source;
1124  ctx->draw_bars = cctx->draw_bars;
1125  ctx->signal_loss_action = cctx->signal_loss_action;
1126  if (!ctx->draw_bars && ctx->signal_loss_action == SIGNAL_LOSS_BARS) {
1127  ctx->signal_loss_action = SIGNAL_LOSS_NONE;
1128  av_log(avctx, AV_LOG_WARNING, "Setting signal_loss_action to none because draw_bars is false\n");
1129  }
1130  if (!ctx->draw_bars && ctx->signal_loss_action != SIGNAL_LOSS_NONE) {
1131  av_log(avctx, AV_LOG_ERROR, "options draw_bars and signal_loss_action are mutually exclusive\n");
1132  av_freep(&ctx);
1133  return AVERROR(EINVAL);
1134  }
1135  ctx->audio_depth = cctx->audio_depth;
1136  if (cctx->raw_format > 0 && (unsigned int)cctx->raw_format < FF_ARRAY_ELEMS(decklink_raw_format_map))
1137  ctx->raw_format = decklink_raw_format_map[cctx->raw_format];
1138  cctx->ctx = ctx;
1139 
1140  /* Check audio channel option for valid values: 2, 8 or 16 */
1141  switch (cctx->audio_channels) {
1142  case 2:
1143  case 8:
1144  case 16:
1145  break;
1146  default:
1147  av_log(avctx, AV_LOG_ERROR, "Value of channels option must be one of 2, 8 or 16\n");
1148  ret = AVERROR(EINVAL);
1149  goto error;
1150  }
1151 
1152  /* Check audio bit depth option for valid values: 16 or 32 */
1153  switch (cctx->audio_depth) {
1154  case 16:
1155  case 32:
1156  break;
1157  default:
1158  av_log(avctx, AV_LOG_ERROR, "Value for audio bit depth option must be either 16 or 32\n");
1159  ret = AVERROR(EINVAL);
1160  goto error;
1161  }
1162 
1163  /* List available devices. */
1164  if (ctx->list_devices) {
1165  ff_decklink_list_devices_legacy(avctx, 1, 0);
1166  ret = AVERROR_EXIT;
1167  goto error;
1168  }
1169 
1170  ret = ff_decklink_init_device(avctx, avctx->url);
1171  if (ret < 0)
1172  goto error;
1173 
1174  /* Get input device. */
1175  if (ctx->dl->QueryInterface(IID_IDeckLinkInput_v14_2_1, (void **) &ctx->dli) != S_OK) {
1176  av_log(avctx, AV_LOG_ERROR, "Could not open input device from '%s'\n",
1177  avctx->url);
1178  ret = AVERROR(EIO);
1179  goto error;
1180  }
1181 
1182  if (ff_decklink_set_configs(avctx, DIRECTION_IN) < 0) {
1183  av_log(avctx, AV_LOG_ERROR, "Could not set input configuration\n");
1184  ret = AVERROR(EIO);
1185  goto error;
1186  }
1187 
1188  /* List supported formats. */
1189  if (ctx->list_formats) {
1191  ret = AVERROR_EXIT;
1192  goto error;
1193  }
1194 
1196  ret = (ctx->dli->SetCallback(input_callback) == S_OK ? 0 : AVERROR_EXTERNAL);
1197  input_callback->Release();
1198  if (ret < 0) {
1199  av_log(avctx, AV_LOG_ERROR, "Cannot set input callback\n");
1200  goto error;
1201  }
1202 
1203  allocator = new decklink_allocator();
1204  ret = (ctx->dli->SetVideoInputFrameMemoryAllocator(allocator) == S_OK ? 0 : AVERROR_EXTERNAL);
1205  allocator->Release();
1206  if (ret < 0) {
1207  av_log(avctx, AV_LOG_ERROR, "Cannot set custom memory allocator\n");
1208  goto error;
1209  }
1210 
1211  if (!cctx->format_code) {
1212  if (decklink_autodetect(cctx) < 0) {
1213  av_log(avctx, AV_LOG_ERROR, "Cannot Autodetect input stream or No signal\n");
1214  ret = AVERROR(EIO);
1215  goto error;
1216  }
1217  av_log(avctx, AV_LOG_INFO, "Autodetected the input mode\n");
1218  }
1219  if (ctx->raw_format == (BMDPixelFormat)0)
1220  ctx->raw_format = bmdFormat8BitYUV;
1221  if (ff_decklink_set_format(avctx, DIRECTION_IN) < 0) {
1222  av_log(avctx, AV_LOG_ERROR, "Could not set format code %s for %s\n",
1223  cctx->format_code ? cctx->format_code : "(unset)", avctx->url);
1224  ret = AVERROR(EIO);
1225  goto error;
1226  }
1227 
1228 #if !CONFIG_LIBZVBI
1229  if (ctx->teletext_lines && ctx->bmd_mode == bmdModePAL) {
1230  av_log(avctx, AV_LOG_ERROR, "Libzvbi support is needed for capturing SD PAL teletext, please recompile FFmpeg.\n");
1231  ret = AVERROR(ENOSYS);
1232  goto error;
1233  }
1234 #endif
1235 
1236  /* Setup streams. */
1237  st = avformat_new_stream(avctx, NULL);
1238  if (!st) {
1239  av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");
1240  ret = AVERROR(ENOMEM);
1241  goto error;
1242  }
1243  st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
1244  st->codecpar->codec_id = cctx->audio_depth == 32 ? AV_CODEC_ID_PCM_S32LE : AV_CODEC_ID_PCM_S16LE;
1245  st->codecpar->sample_rate = bmdAudioSampleRate48kHz;
1246  st->codecpar->ch_layout.nb_channels = cctx->audio_channels;
1247  avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
1248  ctx->audio_st=st;
1249 
1250  st = avformat_new_stream(avctx, NULL);
1251  if (!st) {
1252  av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");
1253  ret = AVERROR(ENOMEM);
1254  goto error;
1255  }
1256  st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
1257  st->codecpar->width = ctx->bmd_width;
1258  st->codecpar->height = ctx->bmd_height;
1259 
1260  st->time_base.den = ctx->bmd_tb_den;
1261  st->time_base.num = ctx->bmd_tb_num;
1262  st->r_frame_rate = av_make_q(st->time_base.den, st->time_base.num);
1263 
1264  switch(ctx->raw_format) {
1265  case bmdFormat8BitYUV:
1266  st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
1267  st->codecpar->format = AV_PIX_FMT_UYVY422;
1268  st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 16, st->time_base.den, st->time_base.num);
1269  break;
1270  case bmdFormat10BitYUV:
1271  st->codecpar->codec_id = AV_CODEC_ID_V210;
1272  st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 64, st->time_base.den, st->time_base.num * 3);
1273  break;
1274  case bmdFormat8BitARGB:
1275  st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
1276  st->codecpar->format = AV_PIX_FMT_0RGB;
1277  st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 32, st->time_base.den, st->time_base.num);
1278  break;
1279  case bmdFormat8BitBGRA:
1280  st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
1281  st->codecpar->format = AV_PIX_FMT_BGR0;
1282  st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 32, st->time_base.den, st->time_base.num);
1283  break;
1284  case bmdFormat10BitRGB:
1285  st->codecpar->codec_id = AV_CODEC_ID_R210;
1286  st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 30, st->time_base.den, st->time_base.num);
1287  break;
1288  default:
1289  char fourcc_str[AV_FOURCC_MAX_STRING_SIZE] = {0};
1290  av_fourcc_make_string(fourcc_str, ctx->raw_format);
1291  av_log(avctx, AV_LOG_ERROR, "Raw Format %s not supported\n", fourcc_str);
1292  ret = AVERROR(EINVAL);
1293  goto error;
1294  }
1295 
1296  switch (ctx->bmd_field_dominance) {
1297  case bmdUpperFieldFirst:
1298  st->codecpar->field_order = AV_FIELD_TT;
1299  break;
1300  case bmdLowerFieldFirst:
1301  st->codecpar->field_order = AV_FIELD_BB;
1302  break;
1303  case bmdProgressiveFrame:
1304  case bmdProgressiveSegmentedFrame:
1305  st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
1306  break;
1307  }
1308 
1309  avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
1310 
1311  ctx->video_st=st;
1312 
1313  if (ctx->enable_klv) {
1314  st = avformat_new_stream(avctx, NULL);
1315  if (!st) {
1316  ret = AVERROR(ENOMEM);
1317  goto error;
1318  }
1319  st->codecpar->codec_type = AVMEDIA_TYPE_DATA;
1320  st->time_base.den = ctx->bmd_tb_den;
1321  st->time_base.num = ctx->bmd_tb_num;
1322  st->codecpar->codec_id = AV_CODEC_ID_SMPTE_KLV;
1323  avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
1324  ctx->klv_st = st;
1325  }
1326 
1327  if (ctx->teletext_lines) {
1328  st = avformat_new_stream(avctx, NULL);
1329  if (!st) {
1330  av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");
1331  ret = AVERROR(ENOMEM);
1332  goto error;
1333  }
1334  st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
1335  st->time_base.den = ctx->bmd_tb_den;
1336  st->time_base.num = ctx->bmd_tb_num;
1337  st->codecpar->codec_id = AV_CODEC_ID_DVB_TELETEXT;
1338  avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
1339  ctx->teletext_st = st;
1340  }
1341 
1342  av_log(avctx, AV_LOG_VERBOSE, "Using %d input audio channels\n", ctx->audio_st->codecpar->ch_layout.nb_channels);
1343  result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz, cctx->audio_depth == 32 ? bmdAudioSampleType32bitInteger : bmdAudioSampleType16bitInteger, ctx->audio_st->codecpar->ch_layout.nb_channels);
1344 
1345  if (result != S_OK) {
1346  av_log(avctx, AV_LOG_ERROR, "Cannot enable audio input\n");
1347  ret = AVERROR(EIO);
1348  goto error;
1349  }
1350 
1351  result = ctx->dli->EnableVideoInput(ctx->bmd_mode,
1352  ctx->raw_format,
1353  bmdVideoInputFlagDefault);
1354 
1355  if (result != S_OK) {
1356  av_log(avctx, AV_LOG_ERROR, "Cannot enable video input\n");
1357  ret = AVERROR(EIO);
1358  goto error;
1359  }
1360 
1361  ff_decklink_packet_queue_init(avctx, &ctx->queue, cctx->queue_size);
1362 
1363  if (ctx->dli->StartStreams() != S_OK) {
1364  av_log(avctx, AV_LOG_ERROR, "Cannot start input stream\n");
1365  ret = AVERROR(EIO);
1366  goto error;
1367  }
1368 
1369  return 0;
1370 
1371 error:
1372  ff_decklink_cleanup(avctx);
1373  av_freep(&cctx->ctx);
1374  return ret;
1375 }
1376 
1378 {
1379  struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
1380  struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
1381 
1382  ff_decklink_packet_queue_get(&ctx->queue, pkt, 1);
1383 
1384  if (ctx->tc_format && !(av_dict_get(ctx->video_st->metadata, "timecode", NULL, 0))) {
1385  size_t size;
1386  const uint8_t *side_metadata = av_packet_get_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA, &size);
1387  if (side_metadata) {
1388  if (av_packet_unpack_dictionary(side_metadata, size, &ctx->video_st->metadata) < 0)
1389  av_log(avctx, AV_LOG_ERROR, "Unable to set timecode\n");
1390  }
1391  }
1392 
1393  return 0;
1394 }
1395 
1397 {
1398  return ff_decklink_list_devices(avctx, device_list, 1, 0);
1399 }
1400 
1401 } /* extern "C" */
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:337
flags
const SwsFlags flags[]
Definition: swscale.c:61
VANCLineNumber::vanc_end
int vanc_end
Definition: decklink_dec.cpp:71
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_TIMECODE_STR_SIZE
#define AV_TIMECODE_STR_SIZE
Definition: timecode.h:33
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
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:213
int64_t
long long int64_t
Definition: coverity.c:34
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: codec_id.h:65
mask
int mask
Definition: mediacodecdec_common.c:154
mode
Definition: swscale.c:56
AVPacket::data
uint8_t * data
Definition: packet.h:588
AV_CODEC_ID_DVB_TELETEXT
@ AV_CODEC_ID_DVB_TELETEXT
Definition: codec_id.h:578
ff_reverse
const uint8_t ff_reverse[256]
Definition: reverse.c:23
data
const char data[16]
Definition: mxf.c:149
AV_PKT_DATA_S12M_TIMECODE
@ AV_PKT_DATA_S12M_TIMECODE
Timecode which conforms to SMPTE ST 12-1:2014.
Definition: packet.h:288
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:606
reverse.h
mathematics.h
AVDictionary
Definition: dict.c:32
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:643
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:214
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:777
av_packet_add_side_data
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
Definition: packet.c:197
AV_FOURCC_MAX_STRING_SIZE
#define AV_FOURCC_MAX_STRING_SIZE
Definition: avutil.h:345
timecode.h
AV_CODEC_ID_R210
@ AV_CODEC_ID_R210
Definition: codec_id.h:185
pts
static int64_t pts
Definition: transcode_aac.c:644
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:202
AVRational::num
int num
Numerator.
Definition: rational.h:59
avassert.h
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AVFormatContext::metadata
AVDictionary * metadata
Metadata that applies to the whole file.
Definition: avformat.h:1496
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:106
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
intreadwrite.h
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
av_parity
#define av_parity
Definition: common.h:160
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
AVFormatContext * ctx
Definition: movenc.c:49
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
av_usleep
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:202
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
if
if(ret)
Definition: filter_design.txt:179
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:571
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
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:783
NULL
#define NULL
Definition: coverity.c:32
VANCLineNumber::field1_vanc_start
int field1_vanc_start
Definition: decklink_dec.cpp:70
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
list
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 list
Definition: filter_design.txt:25
VANCLineNumber::field0_vanc_end
int field0_vanc_end
Definition: decklink_dec.cpp:69
AV_PIX_FMT_BGR0
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition: pixfmt.h:265
time.h
AV_CODEC_ID_SMPTE_KLV
@ AV_CODEC_ID_SMPTE_KLV
Definition: codec_id.h:609
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
av_timecode_init_from_components
int av_timecode_init_from_components(AVTimecode *tc, AVRational rate, int flags, int hh, int mm, int ss, int ff, void *log_ctx)
Init a timecode struct from the passed timecode components.
Definition: timecode.c:211
AVPacket::size
int size
Definition: packet.h:589
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
height
#define height
Definition: dsp.h:89
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
AVFormatContext::url
char * url
input or output URL.
Definition: avformat.h:1380
size
int size
Definition: twinvq_data.h:10344
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
av_fourcc_make_string
char * av_fourcc_make_string(char *buf, uint32_t fourcc)
Fill the provided buffer with a string containing a FourCC (four-character code) representation.
Definition: utils.c:75
AV_CODEC_ID_V210
@ AV_CODEC_ID_V210
Definition: codec_id.h:179
avdevice.h
av_packet_unpack_dictionary
int av_packet_unpack_dictionary(const uint8_t *data, size_t size, AVDictionary **dict)
Unpack a dictionary from side_data.
Definition: packet.c:352
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:587
VANCLineNumber::mode
BMDDisplayMode mode
Definition: decklink_dec.cpp:67
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
line
Definition: graph2dot.c:48
av_packet_pack_dictionary
uint8_t * av_packet_pack_dictionary(AVDictionary *dict, size_t *size)
Pack a dictionary for use in side_data.
Definition: packet.c:317
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:594
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AV_PKT_DATA_STRINGS_METADATA
@ AV_PKT_DATA_STRINGS_METADATA
A list of zero terminated key/value strings.
Definition: packet.h:169
av_timecode_get_smpte_from_framenum
uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum)
Convert frame number to SMPTE 12M binary representation.
Definition: timecode.c:54
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: packet.c:252
VANCLineNumber
Definition: decklink_dec.cpp:66
internal.h
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
AV_FIELD_BB
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition: defs.h:215
common.h
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
len
int len
Definition: vorbis_enc_data.h:426
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
av_cmp_q
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition: rational.h:89
AV_TIMECODE_FLAG_DROPFRAME
@ AV_TIMECODE_FLAG_DROPFRAME
timecode is drop frame
Definition: timecode.h:36
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
KLVPacket
Definition: mxf.h:74
AVDeviceInfoList
List of devices.
Definition: avdevice.h:343
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
avformat.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
AV_PIX_FMT_UYVY422
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition: pixfmt.h:88
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
input_callback
static void input_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
Definition: mmaldec.c:209
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: packet.c:231
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVRational::den
int den
Denominator.
Definition: rational.h:60
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:878
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVPacket::stream_index
int stream_index
Definition: packet.h:590
av_gettime
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
AV_CODEC_ID_PCM_S32LE
@ AV_CODEC_ID_PCM_S32LE
Definition: codec_id.h:345
avutil.h
AV_PKT_DATA_A53_CC
@ AV_PKT_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
Definition: packet.h:239
packet_internal.h
it
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s it
Definition: writing_filters.txt:31
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVPacket
This structure stores compressed data.
Definition: packet.h:565
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
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:86
VANCLineNumber::vanc_start
int vanc_start
Definition: decklink_dec.cpp:68
imgutils.h
AV_PIX_FMT_0RGB
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Definition: pixfmt.h:262
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
width
#define width
Definition: dsp.h:89
AVTimecode
Definition: timecode.h:41
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1292
src
#define src
Definition: vp8dsp.c:248
line
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Definition: swscale.txt:40
av_timecode_make_string
char * av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum_arg)
Load timecode string in buf.
Definition: timecode.c:104