FFmpeg
mlvdec.c
Go to the documentation of this file.
1 /*
2  * Magic Lantern Video (MLV) demuxer
3  * Copyright (c) 2014 Peter Ross
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Magic Lantern Video (MLV) demuxer
25  */
26 
27 #include <time.h>
28 
29 #include "libavcodec/bytestream.h"
30 #include "libavcodec/tiff.h"
31 #include "libavcodec/tiff_common.h"
32 #include "libavutil/imgutils.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/mem.h"
35 #include "libavutil/rational.h"
36 #include "avformat.h"
37 #include "demux.h"
38 #include "internal.h"
39 #include "avio_internal.h"
40 #include "riff.h"
41 
42 #define MLV_VERSION "v2.0"
43 
44 #define MLV_VIDEO_CLASS_RAW 1
45 #define MLV_VIDEO_CLASS_YUV 2
46 #define MLV_VIDEO_CLASS_JPEG 3
47 #define MLV_VIDEO_CLASS_H264 4
48 
49 #define MLV_AUDIO_CLASS_WAV 1
50 
51 #define MLV_CLASS_FLAG_LJ92 0x20
52 #define MLV_CLASS_FLAG_DELTA 0x40
53 #define MLV_CLASS_FLAG_LZMA 0x80
54 
55 typedef struct {
56  AVIOContext *pb[101];
57  int class[2];
59  uint64_t pts;
62  int color_matrix1[9][2];
63 } MlvContext;
64 
65 static int probe(const AVProbeData *p)
66 {
67  if (AV_RL32(p->buf) == MKTAG('M','L','V','I') &&
68  AV_RL32(p->buf + 4) >= 52 &&
69  !memcmp(p->buf + 8, MLV_VERSION, 5))
70  return AVPROBE_SCORE_MAX;
71  return 0;
72 }
73 
74 static int check_file_header(AVIOContext *pb, uint64_t guid)
75 {
76  unsigned int size;
77  uint8_t version[8];
78  int ret;
79 
80  avio_skip(pb, 4);
81  size = avio_rl32(pb);
82  if (size < 52)
83  return AVERROR_INVALIDDATA;
84  ret = ffio_read_size(pb, version, 8);
85  if (ret < 0)
86  return ret;
87  if (memcmp(version, MLV_VERSION, 5) || avio_rl64(pb) != guid)
88  return AVERROR_INVALIDDATA;
89  avio_skip(pb, size - 24);
90  return 0;
91 }
92 
93 static void read_string(AVFormatContext *avctx, AVIOContext *pb, const char *tag, unsigned size)
94 {
95  char * value = av_malloc(size + 1);
96  int ret;
97 
98  if (!value) {
99  avio_skip(pb, size);
100  return;
101  }
102 
103  ret = avio_read(pb, value, size);
104  if (ret != size || !size || !value[0]) {
105  av_free(value);
106  return;
107  }
108 
109  value[size] = 0;
111 }
112 
113 static void read_uint8(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
114 {
115  av_dict_set_int(&avctx->metadata, tag, avio_r8(pb), 0);
116 }
117 
118 static void read_uint16(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
119 {
120  av_dict_set_int(&avctx->metadata, tag, avio_rl16(pb), 0);
121 }
122 
123 static void read_uint32(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
124 {
125  av_dict_set_int(&avctx->metadata, tag, avio_rl32(pb), 0);
126 }
127 
128 static void read_uint64(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
129 {
130  av_dict_set_int(&avctx->metadata, tag, avio_rl64(pb), 0);
131 }
132 
133 static int scan_file(AVFormatContext *avctx, AVStream *vst, AVStream *ast, int file)
134 {
135  FFStream *const vsti = ffstream(vst), *const asti = ffstream(ast);
136  MlvContext *mlv = avctx->priv_data;
137  AVIOContext *pb = mlv->pb[file];
138  int ret;
139  while (!avio_feof(pb)) {
140  int type;
141  unsigned int size;
142  type = avio_rl32(pb);
143  size = avio_rl32(pb);
144  avio_skip(pb, 8); //timestamp
145  if (size < 16)
146  break;
147  size -= 16;
148  if (vst && type == MKTAG('R','A','W','I') && size >= 164) {
149  unsigned width = avio_rl16(pb);
150  unsigned height = avio_rl16(pb);
151  unsigned bits_per_coded_sample;
152  ret = av_image_check_size(width, height, 0, avctx);
153  if (ret < 0)
154  return ret;
155  if (avio_rl32(pb) != 1)
156  avpriv_request_sample(avctx, "raw api version");
157  avio_skip(pb, 20); // pointer, width, height, pitch, frame_size
158  bits_per_coded_sample = avio_rl32(pb);
159  if (bits_per_coded_sample > (INT_MAX - 7) / (width * height)) {
160  av_log(avctx, AV_LOG_ERROR,
161  "invalid bits_per_coded_sample %u (size: %ux%u)\n",
162  bits_per_coded_sample, width, height);
163  return AVERROR_INVALIDDATA;
164  }
165  vst->codecpar->width = width;
166  vst->codecpar->height = height;
167  vst->codecpar->bits_per_coded_sample = bits_per_coded_sample;
168  mlv->black_level = avio_rl32(pb);
169  mlv->white_level = avio_rl32(pb);
170  avio_skip(pb, 16 + 24); // xywh, active_area, exposure_bias
171  if (avio_rl32(pb) != 0x2010100) /* RGGB */
172  avpriv_request_sample(avctx, "cfa_pattern");
173  avio_skip(pb, 4); // calibration_illuminant1,
174  for (int i = 0; i < 9; i++) {
175  mlv->color_matrix1[i][0] = avio_rl32(pb);
176  mlv->color_matrix1[i][1] = avio_rl32(pb);
177  }
178  avio_skip(pb, 4); // dynamic_range
180  vst->codecpar->codec_tag = MKTAG('B', 'I', 'T', 16);
181  size -= 164;
182  } else if (ast && type == MKTAG('W', 'A', 'V', 'I') && size >= 16) {
183  ret = ff_get_wav_header(avctx, pb, ast->codecpar, 16, 0);
184  if (ret < 0)
185  return ret;
186  size -= 16;
187  } else if (type == MKTAG('I','N','F','O')) {
188  if (size > 0)
189  read_string(avctx, pb, "info", size);
190  continue;
191  } else if (type == MKTAG('I','D','N','T') && size >= 36) {
192  read_string(avctx, pb, "cameraName", 32);
193  read_uint32(avctx, pb, "cameraModel", "0x%"PRIx32);
194  size -= 36;
195  if (size >= 32) {
196  read_string(avctx, pb, "cameraSerial", 32);
197  size -= 32;
198  }
199  } else if (type == MKTAG('L','E','N','S') && size >= 48) {
200  read_uint16(avctx, pb, "focalLength", "%i");
201  read_uint16(avctx, pb, "focalDist", "%i");
202  read_uint16(avctx, pb, "aperture", "%i");
203  read_uint8(avctx, pb, "stabilizerMode", "%i");
204  read_uint8(avctx, pb, "autofocusMode", "%i");
205  read_uint32(avctx, pb, "flags", "0x%"PRIx32);
206  read_uint32(avctx, pb, "lensID", "%"PRIi32);
207  read_string(avctx, pb, "lensName", 32);
208  size -= 48;
209  if (size >= 32) {
210  read_string(avctx, pb, "lensSerial", 32);
211  size -= 32;
212  }
213  } else if (vst && type == MKTAG('V', 'I', 'D', 'F') && size >= 4) {
214  uint64_t pts = avio_rl32(pb);
217  avio_tell(pb) - 20, pts, file, 0, AVINDEX_KEYFRAME);
218  size -= 4;
219  } else if (ast && type == MKTAG('A', 'U', 'D', 'F') && size >= 4) {
220  uint64_t pts = avio_rl32(pb);
221  ff_add_index_entry(&asti->index_entries, &asti->nb_index_entries,
222  &asti->index_entries_allocated_size,
223  avio_tell(pb) - 20, pts, file, 0, AVINDEX_KEYFRAME);
224  size -= 4;
225  } else if (vst && type == MKTAG('W','B','A','L') && size >= 28) {
226  read_uint32(avctx, pb, "wb_mode", "%"PRIi32);
227  read_uint32(avctx, pb, "kelvin", "%"PRIi32);
228  read_uint32(avctx, pb, "wbgain_r", "%"PRIi32);
229  read_uint32(avctx, pb, "wbgain_g", "%"PRIi32);
230  read_uint32(avctx, pb, "wbgain_b", "%"PRIi32);
231  read_uint32(avctx, pb, "wbs_gm", "%"PRIi32);
232  read_uint32(avctx, pb, "wbs_ba", "%"PRIi32);
233  size -= 28;
234  } else if (type == MKTAG('R','T','C','I') && size >= 20) {
235  char str[32];
236  struct tm time = { 0 };
237  time.tm_sec = avio_rl16(pb);
238  time.tm_min = avio_rl16(pb);
239  time.tm_hour = avio_rl16(pb);
240  time.tm_mday = avio_rl16(pb);
241  time.tm_mon = avio_rl16(pb);
242  time.tm_year = avio_rl16(pb);
243  time.tm_wday = avio_rl16(pb);
244  time.tm_yday = avio_rl16(pb);
245  time.tm_isdst = avio_rl16(pb);
246  avio_skip(pb, 2);
247  if (strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S", &time))
248  av_dict_set(&avctx->metadata, "time", str, 0);
249  size -= 20;
250  } else if (type == MKTAG('E','X','P','O') && size >= 16) {
251  av_dict_set(&avctx->metadata, "isoMode", avio_rl32(pb) ? "auto" : "manual", 0);
252  read_uint32(avctx, pb, "isoValue", "%"PRIi32);
253  read_uint32(avctx, pb, "isoAnalog", "%"PRIi32);
254  read_uint32(avctx, pb, "digitalGain", "%"PRIi32);
255  size -= 16;
256  if (size >= 8) {
257  read_uint64(avctx, pb, "shutterValue", "%"PRIi64);
258  size -= 8;
259  }
260  } else if (type == MKTAG('S','T','Y','L') && size >= 36) {
261  read_uint32(avctx, pb, "picStyleId", "%"PRIi32);
262  read_uint32(avctx, pb, "contrast", "%"PRIi32);
263  read_uint32(avctx, pb, "sharpness", "%"PRIi32);
264  read_uint32(avctx, pb, "saturation", "%"PRIi32);
265  read_uint32(avctx, pb, "colortone", "%"PRIi32);
266  read_string(avctx, pb, "picStyleName", 16);
267  size -= 36;
268  } else if (type == MKTAG('V','E','R','S') && size >= 4) {
269  unsigned int length = avio_rl32(pb);
270  read_string(avctx, pb, "version", length);
271  size -= length + 4;
272  } else if (type == MKTAG('D','A','R','K')) {
273  } else if (type == MKTAG('D','I','S','O')) {
274  } else if (type == MKTAG('M','A','R','K')) {
275  } else if (type == MKTAG('N','U','L','L')) {
276  } else if (type == MKTAG('M','L','V','I')) { /* occurs when MLV and Mnn files are concatenated */
277  } else if (type == MKTAG('R','A','W','C')) {
278  } else {
279  av_log(avctx, AV_LOG_INFO, "unsupported tag %s, size %u\n",
281  }
282  avio_skip(pb, size);
283  }
284  return 0;
285 }
286 
287 static int read_header(AVFormatContext *avctx)
288 {
289  MlvContext *mlv = avctx->priv_data;
290  AVIOContext *pb = avctx->pb;
291  AVStream *vst = NULL, *ast = NULL;
292  FFStream *vsti = NULL, *asti = NULL;
293  int size, ret;
294  unsigned nb_video_frames, nb_audio_frames;
295  uint64_t guid;
296  char guidstr[32];
297 
298  avio_skip(pb, 4);
299  size = avio_rl32(pb);
300  if (size < 52)
301  return AVERROR_INVALIDDATA;
302 
303  avio_skip(pb, 8);
304 
305  guid = avio_rl64(pb);
306  snprintf(guidstr, sizeof(guidstr), "0x%"PRIx64, guid);
307  av_dict_set(&avctx->metadata, "guid", guidstr, 0);
308 
309  avio_skip(pb, 8); //fileNum, fileCount, fileFlags
310 
311  mlv->class[0] = avio_rl16(pb);
312  mlv->class[1] = avio_rl16(pb);
313 
314  nb_video_frames = avio_rl32(pb);
315  nb_audio_frames = avio_rl32(pb);
316 
317  if (nb_video_frames && mlv->class[0]) {
318  vst = avformat_new_stream(avctx, NULL);
319  if (!vst)
320  return AVERROR(ENOMEM);
321  vsti = ffstream(vst);
322 
323  vst->id = 0;
324  vst->nb_frames = nb_video_frames;
326  avpriv_request_sample(avctx, "compression");
328  switch (mlv->class[0] & ~(MLV_CLASS_FLAG_DELTA|MLV_CLASS_FLAG_LZMA)) {
329  case MLV_VIDEO_CLASS_RAW:
331  break;
332  case MLV_VIDEO_CLASS_YUV:
335  vst->codecpar->codec_tag = 0;
336  break;
339  break;
342  vst->codecpar->codec_tag = 0;
343  break;
346  vst->codecpar->codec_tag = 0;
347  break;
348  default:
349  avpriv_request_sample(avctx, "unknown video class");
350  }
351  }
352 
353  if (nb_audio_frames && mlv->class[1]) {
354  ast = avformat_new_stream(avctx, NULL);
355  if (!ast)
356  return AVERROR(ENOMEM);
357  asti = ffstream(ast);
358  ast->id = 1;
359  ast->nb_frames = nb_audio_frames;
360  if ((mlv->class[1] & MLV_CLASS_FLAG_LZMA))
361  avpriv_request_sample(avctx, "compression");
362  if ((mlv->class[1] & ~MLV_CLASS_FLAG_LZMA) != MLV_AUDIO_CLASS_WAV)
363  avpriv_request_sample(avctx, "unknown audio class");
364 
365  ast->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
366  avpriv_set_pts_info(ast, 33, 1, ast->codecpar->sample_rate);
367  }
368 
369  if (vst) {
371  framerate.num = avio_rl32(pb);
372  framerate.den = avio_rl32(pb);
373  avpriv_set_pts_info(vst, 64, framerate.den, framerate.num);
374  } else
375  avio_skip(pb, 8);
376 
377  avio_skip(pb, size - 52);
378 
379  /* scan primary file */
380  mlv->pb[100] = avctx->pb;
381  ret = scan_file(avctx, vst, ast, 100);
382  if (ret < 0)
383  return ret;
384 
385  /* scan secondary files */
386  if (strlen(avctx->url) > 2) {
387  int i;
388  char *filename = av_strdup(avctx->url);
389 
390  if (!filename)
391  return AVERROR(ENOMEM);
392 
393  for (i = 0; i < 100; i++) {
394  snprintf(filename + strlen(filename) - 2, 3, "%02d", i);
395  if (avctx->io_open(avctx, &mlv->pb[i], filename, AVIO_FLAG_READ, NULL) < 0)
396  break;
397  if (check_file_header(mlv->pb[i], guid) < 0) {
398  av_log(avctx, AV_LOG_WARNING, "ignoring %s; bad format or guid mismatch\n", filename);
399  ff_format_io_close(avctx, &mlv->pb[i]);
400  continue;
401  }
402  av_log(avctx, AV_LOG_INFO, "scanning %s\n", filename);
403  ret = scan_file(avctx, vst, ast, i);
404  if (ret < 0) {
405  av_log(avctx, AV_LOG_WARNING, "ignoring %s; %s\n", filename, av_err2str(ret));
406  ff_format_io_close(avctx, &mlv->pb[i]);
407  continue;
408  }
409  }
410  av_free(filename);
411  }
412 
413  if (vst)
414  vst->duration = vsti->nb_index_entries;
415  if (ast)
416  ast->duration = asti->nb_index_entries;
417 
418  if ((vst && !vsti->nb_index_entries) || (ast && !asti->nb_index_entries)) {
419  av_log(avctx, AV_LOG_ERROR, "no index entries found\n");
420  return AVERROR_INVALIDDATA;
421  }
422 
423  if (vst && ast)
424  avio_seek(pb, FFMIN(vsti->index_entries[0].pos, asti->index_entries[0].pos), SEEK_SET);
425  else if (vst)
426  avio_seek(pb, vsti->index_entries[0].pos, SEEK_SET);
427  else if (ast)
428  avio_seek(pb, asti->index_entries[0].pos, SEEK_SET);
429 
430  return 0;
431 }
432 
433 static void write_tiff_short(PutByteContext *pb, int tag, int value)
434 {
435  bytestream2_put_le16(pb, tag);
436  bytestream2_put_le16(pb, AV_TIFF_SHORT);
437  bytestream2_put_le32(pb, 1);
438  bytestream2_put_le16(pb, value);
439  bytestream2_put_le16(pb, 0);
440 }
441 
442 static void write_tiff_short2(PutByteContext *pb, int tag, int v1, int v2)
443 {
444  bytestream2_put_le16(pb, tag);
445  bytestream2_put_le16(pb, AV_TIFF_SHORT);
446  bytestream2_put_le32(pb, 2);
447  bytestream2_put_le16(pb, v1);
448  bytestream2_put_le16(pb, v2);
449 }
450 
451 static void write_tiff_long(PutByteContext *pb, int tag, int value)
452 {
453  bytestream2_put_le16(pb, tag);
454  bytestream2_put_le16(pb, AV_TIFF_LONG);
455  bytestream2_put_le32(pb, 1);
456  bytestream2_put_le32(pb, value);
457 }
458 
459 static void write_tiff_byte4(PutByteContext *pb, int tag, int v1, int v2, int v3, int v4)
460 {
461  bytestream2_put_le16(pb, tag);
462  bytestream2_put_le16(pb, AV_TIFF_BYTE);
463  bytestream2_put_le32(pb, 4);
464  bytestream2_put_byte(pb, v1);
465  bytestream2_put_byte(pb, v2);
466  bytestream2_put_byte(pb, v3);
467  bytestream2_put_byte(pb, v4);
468 }
469 
471 {
472  MlvContext *mlv = avctx->priv_data;
473  PutByteContext pbctx, *pb = &pbctx;
474  int ret, header_size;
475  uint8_t *stripofs, *matrixofs;
476 
477 #define MAX_HEADER_SIZE 2048
478  if ((uint64_t)size > INT32_MAX - MAX_HEADER_SIZE)
479  return AVERROR_PATCHWELCOME;
480 
481  if ((ret = av_new_packet(pkt, size + MAX_HEADER_SIZE)) < 0)
482  return ret;
483 
485 
486  bytestream2_put_le16(pb, 0x4949);
487  bytestream2_put_le16(pb, 42);
488  bytestream2_put_le32(pb, 8);
489 
490  bytestream2_put_le16(pb, 18); /* nb_entries */
491 
499  write_tiff_long(pb, TIFF_STRIP_OFFS, 0); /* stripofs */
500  stripofs = pb->buffer - 4;
501 
507  write_tiff_byte4(pb, TIFF_CFA_PATTERN, 0, 1, 1, 2);
508  write_tiff_byte4(pb, DNG_VERSION, 1, 4, 0, 0);
511 
512  bytestream2_put_le16(pb, DNG_COLOR_MATRIX1);
513  bytestream2_put_le16(pb, AV_TIFF_SRATIONAL);
514  bytestream2_put_le32(pb, 9);
515  bytestream2_put_le32(pb, 0); /* matrixofs */
516  matrixofs = pb->buffer - 4;
517  bytestream2_put_le32(pb, 0);
518 
519  AV_WL32(matrixofs, bytestream2_tell_p(pb));
520  for (int i = 0; i < 9; i++) {
521  bytestream2_put_le32(pb, mlv->color_matrix1[i][0]);
522  bytestream2_put_le32(pb, mlv->color_matrix1[i][1]);
523  }
524 
525  header_size = bytestream2_tell_p(pb);
526 
527  AV_WL32(stripofs, header_size);
528  ret = avio_read(pbio, pkt->data + header_size, size);
529  if (ret < 0)
530  return ret;
531 
532  return 0;
533 }
534 
536 {
537  MlvContext *mlv = avctx->priv_data;
538  AVIOContext *pb;
539  AVStream *st;
540  FFStream *sti;
541  int index, ret;
542  unsigned int size, space;
543 
544  if (!avctx->nb_streams)
545  return AVERROR_EOF;
546 
547  st = avctx->streams[mlv->stream_index];
548  sti = ffstream(st);
549  if (mlv->pts >= st->duration)
550  return AVERROR_EOF;
551 
553  if (index < 0) {
554  av_log(avctx, AV_LOG_ERROR, "could not find index entry for frame %"PRId64"\n", mlv->pts);
555  return AVERROR_INVALIDDATA;
556  }
557 
558  pb = mlv->pb[sti->index_entries[index].size];
559  if (!pb) {
560  ret = FFERROR_REDO;
561  goto next_packet;
562  }
563  avio_seek(pb, sti->index_entries[index].pos, SEEK_SET);
564 
565  avio_skip(pb, 4); // blockType
566  size = avio_rl32(pb);
567  if (size < 16)
568  return AVERROR_INVALIDDATA;
569  avio_skip(pb, 12); //timestamp, frameNumber
570  size -= 12;
571  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
572  if (size < 8)
573  return AVERROR_INVALIDDATA;
574  avio_skip(pb, 8); // cropPosX, cropPosY, panPosX, panPosY
575  size -= 8;
576  }
577  space = avio_rl32(pb);
578  if (size < space + 4LL)
579  return AVERROR_INVALIDDATA;
580  avio_skip(pb, space);
581  size -= space;
582 
583  if ((mlv->class[st->id] & (MLV_CLASS_FLAG_DELTA|MLV_CLASS_FLAG_LZMA))) {
585  } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
586  if (st->codecpar->codec_id == AV_CODEC_ID_TIFF)
587  ret = get_packet_lj92(avctx, st, pb, pkt, size);
588  else
589  ret = av_get_packet(pb, pkt, (st->codecpar->width * st->codecpar->height * st->codecpar->bits_per_coded_sample + 7) >> 3);
590  } else { // AVMEDIA_TYPE_AUDIO
591  ret = av_get_packet(pb, pkt, size - 4);
592  }
593 
594  if (ret < 0)
595  return ret;
596 
597  pkt->stream_index = mlv->stream_index;
598  pkt->pts = mlv->pts;
599 
600  ret = 0;
601 next_packet:
602  mlv->stream_index++;
603  if (mlv->stream_index == avctx->nb_streams) {
604  mlv->stream_index = 0;
605  mlv->pts++;
606  }
607  return ret;
608 }
609 
610 static int read_seek(AVFormatContext *avctx, int stream_index, int64_t timestamp, int flags)
611 {
612  MlvContext *mlv = avctx->priv_data;
613 
615  return AVERROR(ENOSYS);
616 
617  if (!(avctx->pb->seekable & AVIO_SEEKABLE_NORMAL))
618  return AVERROR(ENOSYS);
619 
620  mlv->pts = timestamp;
621  return 0;
622 }
623 
625 {
626  MlvContext *mlv = s->priv_data;
627  int i;
628  for (i = 0; i < 100; i++)
629  ff_format_io_close(s, &mlv->pb[i]);
630  return 0;
631 }
632 
634  .p.name = "mlv",
635  .p.long_name = NULL_IF_CONFIG_SMALL("Magic Lantern Video (MLV)"),
636  .priv_data_size = sizeof(MlvContext),
637  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
638  .read_probe = probe,
642  .read_seek = read_seek,
643 };
flags
const SwsFlags flags[]
Definition: swscale.c:72
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
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
MLV_VIDEO_CLASS_RAW
#define MLV_VIDEO_CLASS_RAW
Definition: mlvdec.c:44
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
space
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated space
Definition: undefined.txt:4
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
MLV_AUDIO_CLASS_WAV
#define MLV_AUDIO_CLASS_WAV
Definition: mlvdec.c:49
AVSEEK_FLAG_FRAME
#define AVSEEK_FLAG_FRAME
seeking based on frame number
Definition: avformat.h:2476
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
TIFF_CFA_PATTERN_DIM
@ TIFF_CFA_PATTERN_DIM
Definition: tiff.h:88
rational.h
int64_t
long long int64_t
Definition: coverity.c:34
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: codec_id.h:65
MlvContext::stream_index
int stream_index
Definition: mlvdec.c:58
read_uint64
static void read_uint64(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
Definition: mlvdec.c:128
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1331
AVPacket::data
uint8_t * data
Definition: packet.h:588
read_string
static void read_string(AVFormatContext *avctx, AVIOContext *pb, const char *tag, unsigned size)
Definition: mlvdec.c:93
AVSEEK_FLAG_BYTE
#define AVSEEK_FLAG_BYTE
seeking based on position in bytes
Definition: avformat.h:2474
MlvContext::black_level
int black_level
Definition: mlvdec.c:60
ff_mlv_demuxer
const FFInputFormat ff_mlv_demuxer
Definition: mlvdec.c:633
read_uint32
static void read_uint32(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
Definition: mlvdec.c:123
TIFF_NEWJPEG
@ TIFF_NEWJPEG
Definition: tiff.h:133
write_tiff_short
static void write_tiff_short(PutByteContext *pb, int tag, int value)
Definition: mlvdec.c:433
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
TIFF_ROWSPERSTRIP
@ TIFF_ROWSPERSTRIP
Definition: tiff.h:59
scan_file
static int scan_file(AVFormatContext *avctx, AVStream *vst, AVStream *ast, int file)
Definition: mlvdec.c:133
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:606
TIFF_FILL_ORDER
@ TIFF_FILL_ORDER
Definition: tiff.h:51
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
AV_TIFF_SHORT
@ AV_TIFF_SHORT
Definition: exif.h:45
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:781
MlvContext
Definition: mlvdec.c:55
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:362
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2475
FFStream::index_entries_allocated_size
unsigned int index_entries_allocated_size
Definition: internal.h:187
AVIOContext::pos
int64_t pos
position in the file of the current buffer
Definition: avio.h:237
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
pts
static int64_t pts
Definition: transcode_aac.c:644
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:803
read_header
static int read_header(AVFormatContext *avctx)
Definition: mlvdec.c:287
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:717
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
write_tiff_long
static void write_tiff_long(PutByteContext *pb, int tag, int value)
Definition: mlvdec.c:451
read_seek
static int read_seek(AVFormatContext *avctx, int stream_index, int64_t timestamp, int flags)
Definition: mlvdec.c:610
MAX_HEADER_SIZE
#define MAX_HEADER_SIZE
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:1495
read_uint16
static void read_uint16(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
Definition: mlvdec.c:118
TIFF_SUBFILE
@ TIFF_SUBFILE
Definition: tiff.h:45
bytestream2_init_writer
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
Definition: bytestream.h:147
MLV_VERSION
#define MLV_VERSION
Definition: mlvdec.c:42
read_uint8
static void read_uint8(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
Definition: mlvdec.c:113
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:98
MlvContext::pb
AVIOContext * pb[101]
Definition: mlvdec.c:56
AV_PIX_FMT_BAYER_RGGB16LE
@ AV_PIX_FMT_BAYER_RGGB16LE
bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian
Definition: pixfmt.h:291
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
bytestream2_tell_p
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
Definition: bytestream.h:197
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
AVIndexEntry::size
int size
Definition: avformat.h:609
TIFF_STRIP_SIZE
@ TIFF_STRIP_SIZE
Definition: tiff.h:60
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
FF_INFMT_FLAG_INIT_CLEANUP
#define FF_INFMT_FLAG_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition: demux.h:35
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
framerate
float framerate
Definition: av1_levels.c:29
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
read_close
static int read_close(AVFormatContext *s)
Definition: mlvdec.c:624
MLV_VIDEO_CLASS_JPEG
#define MLV_VIDEO_CLASS_JPEG
Definition: mlvdec.c:46
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
MlvContext::white_level
int white_level
Definition: mlvdec.c:61
MlvContext::color_matrix1
int color_matrix1[9][2]
Definition: mlvdec.c:62
tiff.h
tiff_common.h
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1305
read_packet
static int read_packet(AVFormatContext *avctx, AVPacket *pkt)
Definition: mlvdec.c:535
FFStream::nb_index_entries
int nb_index_entries
Definition: internal.h:186
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
time.h
TIFF_SAMPLES_PER_PIXEL
@ TIFF_SAMPLES_PER_PIXEL
Definition: tiff.h:58
TIFF_WIDTH
@ TIFF_WIDTH
Definition: tiff.h:46
index
int index
Definition: gxfenc.c:90
AVStream::nb_frames
int64_t nb_frames
number of frames in this stream if known or 0
Definition: avformat.h:805
write_tiff_short2
static void write_tiff_short2(PutByteContext *pb, int tag, int v1, int v2)
Definition: mlvdec.c:442
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1319
PutByteContext
Definition: bytestream.h:37
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:733
AV_TIFF_BYTE
@ AV_TIFF_BYTE
Definition: exif.h:43
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:261
height
#define height
Definition: dsp.h:89
FFStream
Definition: internal.h:128
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
AVFormatContext::url
char * url
input or output URL.
Definition: avformat.h:1379
PutByteContext::buffer
uint8_t * buffer
Definition: bytestream.h:38
size
int size
Definition: twinvq_data.h:10344
ff_format_io_close
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition: avformat.c:903
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
MLV_VIDEO_CLASS_YUV
#define MLV_VIDEO_CLASS_YUV
Definition: mlvdec.c:45
version
version
Definition: libkvazaar.c:313
TIFF_COMPR
@ TIFF_COMPR
Definition: tiff.h:49
TIFF_HEIGHT
@ TIFF_HEIGHT
Definition: tiff.h:47
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
FFERROR_REDO
#define FFERROR_REDO
Returned by demuxers to indicate that data was consumed but discarded (ignored streams or junk data).
Definition: demux.h:224
DNG_BLACK_LEVEL
@ DNG_BLACK_LEVEL
Definition: tiff.h:105
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:59
check_file_header
static int check_file_header(AVIOContext *pb, uint64_t guid)
Definition: mlvdec.c:74
TIFF_PHOTOMETRIC_CFA
@ TIFF_PHOTOMETRIC_CFA
Definition: tiff.h:201
AV_TIFF_SRATIONAL
@ AV_TIFF_SRATIONAL
Definition: exif.h:52
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
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
avio_internal.h
AVCodecParameters::height
int height
Definition: codec_par.h:135
TIFF_PLANAR
@ TIFF_PLANAR
Definition: tiff.h:63
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
demux.h
DNG_VERSION
@ DNG_VERSION
Definition: tiff.h:102
ff_get_wav_header
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
Definition: riffdec.c:95
TIFF_CFA_PATTERN
@ TIFF_CFA_PATTERN
Definition: tiff.h:89
TIFF_STRIP_OFFS
@ TIFF_STRIP_OFFS
Definition: tiff.h:56
ff_add_index_entry
int ff_add_index_entry(AVIndexEntry **index_entries, int *nb_index_entries, unsigned int *index_entries_allocated_size, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Internal version of av_add_index_entry.
Definition: seek.c:64
av_get_packet
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:98
get_packet_lj92
static int get_packet_lj92(AVFormatContext *avctx, AVStream *st, AVIOContext *pbio, AVPacket *pkt, int64_t size)
Definition: mlvdec.c:470
MLV_VIDEO_CLASS_H264
#define MLV_VIDEO_CLASS_H264
Definition: mlvdec.c:47
tag
uint32_t tag
Definition: movenc.c:2046
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
DNG_WHITE_LEVEL
@ DNG_WHITE_LEVEL
Definition: tiff.h:106
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
TIFF_BPP
@ TIFF_BPP
Definition: tiff.h:48
avformat.h
TIFF_PHOTOMETRIC
@ TIFF_PHOTOMETRIC
Definition: tiff.h:50
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
AVFormatContext::io_open
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
Definition: avformat.h:1863
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:599
MLV_CLASS_FLAG_DELTA
#define MLV_CLASS_FLAG_DELTA
Definition: mlvdec.c:52
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
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:321
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:184
av_dict_set_int
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
Definition: dict.c:177
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:617
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:110
mem.h
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
AVCodecParameters::format
int format
Definition: codec_par.h:92
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:565
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
riff.h
DNG_COLOR_MATRIX1
@ DNG_COLOR_MATRIX1
Definition: tiff.h:107
FFInputFormat
Definition: demux.h:66
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:741
bytestream.h
MLV_CLASS_FLAG_LJ92
#define MLV_CLASS_FLAG_LJ92
Definition: mlvdec.c:51
imgutils.h
MLV_CLASS_FLAG_LZMA
#define MLV_CLASS_FLAG_LZMA
Definition: mlvdec.c:53
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
ffio_read_size
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:665
probe
static int probe(const AVProbeData *p)
Definition: mlvdec.c:65
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:148
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
av_image_check_size
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:318
width
#define width
Definition: dsp.h:89
AV_TIFF_LONG
@ AV_TIFF_LONG
Definition: exif.h:46
snprintf
#define snprintf
Definition: snprintf.h:34
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1291
write_tiff_byte4
static void write_tiff_byte4(PutByteContext *pb, int tag, int v1, int v2, int v3, int v4)
Definition: mlvdec.c:459
MlvContext::class
int class[2]
Definition: mlvdec.c:57
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:347
av_index_search_timestamp
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
Definition: seek.c:245
MlvContext::pts
uint64_t pts
Definition: mlvdec.c:59
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349