42#define MLV_VERSION "v2.0"
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
49#define MLV_AUDIO_CLASS_WAV 1
51#define MLV_CLASS_FLAG_LJ92 0x20
52#define MLV_CLASS_FLAG_DELTA 0x40
53#define MLV_CLASS_FLAG_LZMA 0x80
151 unsigned bits_per_coded_sample;
159 if (bits_per_coded_sample > (INT_MAX - 7) / (
width *
height)) {
161 "invalid bits_per_coded_sample %u (size: %ux%u)\n",
174 for (
int i = 0;
i < 9;
i++) {
182 }
else if (ast &&
type ==
MKTAG(
'W',
'A',
'V',
'I') &&
size >= 16) {
187 }
else if (
type ==
MKTAG(
'I',
'N',
'F',
'O')) {
193 read_uint32(avctx, pb,
"cameraModel",
"0x%"PRIx32);
203 read_uint8(avctx, pb,
"stabilizerMode",
"%i");
213 }
else if (vst &&
type ==
MKTAG(
'V',
'I',
'D',
'F') &&
size >= 4) {
219 }
else if (ast &&
type ==
MKTAG(
'A',
'U',
'D',
'F') &&
size >= 4) {
222 &asti->index_entries_allocated_size,
225 }
else if (vst &&
type ==
MKTAG(
'W',
'B',
'A',
'L') &&
size >= 28) {
236 struct tm time = { 0 };
247 if (strftime(str,
sizeof(str),
"%Y-%m-%d %H:%M:%S", &time))
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')) {
277 }
else if (
type ==
MKTAG(
'R',
'A',
'W',
'C')) {
294 unsigned nb_video_frames, nb_audio_frames;
306 snprintf(guidstr,
sizeof(guidstr),
"0x%"PRIx64, guid);
317 if (nb_video_frames && mlv->
class[0]) {
353 if (nb_audio_frames && mlv->
class[1]) {
359 ast->nb_frames = nb_audio_frames;
380 mlv->
pb[100] = avctx->
pb;
386 if (strlen(avctx->
url) > 2) {
393 for (
i = 0;
i < 100;
i++) {
394 snprintf(filename + strlen(filename) - 2, 3,
"%02d",
i);
416 ast->duration = asti->nb_index_entries;
435 bytestream2_put_le16(pb,
tag);
437 bytestream2_put_le32(pb, 1);
438 bytestream2_put_le16(pb,
value);
439 bytestream2_put_le16(pb, 0);
444 bytestream2_put_le16(pb,
tag);
446 bytestream2_put_le32(pb, 2);
447 bytestream2_put_le16(pb, v1);
448 bytestream2_put_le16(pb, v2);
453 bytestream2_put_le16(pb,
tag);
455 bytestream2_put_le32(pb, 1);
456 bytestream2_put_le32(pb,
value);
461 bytestream2_put_le16(pb,
tag);
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);
474 int ret, header_size;
475 uint8_t *stripofs, *matrixofs;
477#define MAX_HEADER_SIZE 2048
486 bytestream2_put_le16(pb, 0x4949);
487 bytestream2_put_le16(pb, 42);
488 bytestream2_put_le32(pb, 8);
490 bytestream2_put_le16(pb, 18);
500 stripofs = pb->
buffer - 4;
514 bytestream2_put_le32(pb, 9);
515 bytestream2_put_le32(pb, 0);
516 matrixofs = pb->
buffer - 4;
517 bytestream2_put_le32(pb, 0);
520 for (
int i = 0;
i < 9;
i++) {
527 AV_WL32(stripofs, header_size);
621 mlv->
pts = timestamp;
629 for (
i = 0;
i < 100;
i++)
static int probe(const AVProbeData *p)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
#define AVIO_FLAG_READ
read-only
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
unsigned int avio_rl16(AVIOContext *s)
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
unsigned int avio_rl32(AVIOContext *s)
int avio_r8(AVIOContext *s)
uint64_t avio_rl64(AVIOContext *s)
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static int read_probe(const AVProbeData *p)
#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...
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.
#define FFERROR_REDO
Returned by demuxers to indicate that data was consumed but discarded (ignored streams or junk data).
static int read_header(FFV1Context *f, RangeCoder *c)
void av_shrink_packet(AVPacket *pkt, int size)
Reduce packet size, correctly zeroing padding.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
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.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define av_fourcc2str(fourcc)
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...
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static av_cold int read_close(AVFormatContext *ctx)
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
#define MKTAG(a, b, c, d)
Memory handling functions.
static int get_packet_lj92(AVFormatContext *avctx, AVStream *st, AVIOContext *pbio, AVPacket *pkt, int64_t size)
static void read_uint8(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
#define MLV_AUDIO_CLASS_WAV
static int read_header(AVFormatContext *avctx)
#define MLV_VIDEO_CLASS_RAW
static int read_close(AVFormatContext *s)
#define MLV_CLASS_FLAG_LJ92
#define MLV_VIDEO_CLASS_YUV
static int check_file_header(AVIOContext *pb, uint64_t guid)
#define MLV_VIDEO_CLASS_JPEG
static void read_uint32(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
static void write_tiff_short2(PutByteContext *pb, int tag, int v1, int v2)
static void write_tiff_short(PutByteContext *pb, int tag, int value)
static void read_string(AVFormatContext *avctx, AVIOContext *pb, const char *tag, unsigned size)
static int read_packet(AVFormatContext *avctx, AVPacket *pkt)
#define MLV_CLASS_FLAG_LZMA
#define MLV_VIDEO_CLASS_H264
static int scan_file(AVFormatContext *avctx, AVStream *vst, AVStream *ast, int file)
static void read_uint64(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
static void read_uint16(AVFormatContext *avctx, AVIOContext *pb, const char *tag, const char *fmt)
static void write_tiff_byte4(PutByteContext *pb, int tag, int v1, int v2, int v3, int v4)
static void write_tiff_long(PutByteContext *pb, int tag, int value)
#define MLV_CLASS_FLAG_DELTA
static int read_seek(AVFormatContext *avctx, int stream_index, int64_t timestamp, int flags)
static int probe(const AVProbeData *p)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_BAYER_RGGB16LE
bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian
Utilities for rational number calculation.
internal header for RIFF based (de)muxers do NOT include this in end user applications
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
int height
The height of the video frame in pixels.
int bits_per_coded_sample
The number of bits per sample in the codedwords.
int width
The width of the video frame in pixels.
enum AVMediaType codec_type
General type of the encoded data.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
AVIOContext * pb
I/O context.
AVDictionary * metadata
Metadata that applies to the whole file.
char * url
input or output URL.
void * priv_data
Format private data.
AVStream ** streams
A list of all streams in the file.
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
int64_t pos
position in the file of the current buffer
This structure stores compressed data.
This structure contains the data a format has to probe a file.
Rational number (pair of numerator and denominator).
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int64_t nb_frames
number of frames in this stream if known or 0
int64_t duration
Decoding: duration of the stream, in stream time base.
int id
Format-specific stream ID.
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
unsigned int index_entries_allocated_size
#define avpriv_request_sample(...)
TIFF constants & data structures.