1/*
2 * MXF
3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
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#ifndef AVFORMAT_MXF_H
22#define AVFORMAT_MXF_H
23
24#include "avformat.h"
25#include "libavcodec/avcodec.h"
26#include <stdint.h>
27
28typedef uint8_t UID[16];
29
30enum MXFMetadataSetType {
31    AnyType,
32    MaterialPackage,
33    SourcePackage,
34    SourceClip,
35    TimecodeComponent,
36    Sequence,
37    MultipleDescriptor,
38    Descriptor,
39    Track,
40    CryptoContext,
41    Preface,
42    Identification,
43    ContentStorage,
44    SubDescriptor,
45    IndexTableSegment,
46    EssenceContainerData,
47    TypeBottom,// add metadata type before this
48};
49
50enum MXFFrameLayout {
51    FullFrame = 0,
52    SeparateFields,
53    OneField,
54    MixedFields,
55    SegmentedFrame,
56};
57
58typedef struct KLVPacket {
59    UID key;
60    int64_t offset;
61    uint64_t length;
62} KLVPacket;
63
64typedef struct MXFCodecUL {
65    UID uid;
66    unsigned matching_len;
67    int id;
68} MXFCodecUL;
69
70typedef struct {
71    struct AVRational time_base;
72    int samples_per_frame[6];
73} MXFSamplesPerFrame;
74
75extern const MXFCodecUL ff_mxf_data_definition_uls[];
76extern const MXFCodecUL ff_mxf_codec_uls[];
77extern const MXFCodecUL ff_mxf_pixel_format_uls[];
78
79int ff_mxf_decode_pixel_layout(const char pixel_layout[16], enum AVPixelFormat *pix_fmt);
80const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s, AVRational time_base);
81
82#ifdef DEBUG
83#define PRINT_KEY(pc, s, x)                         \
84    av_log(pc, AV_LOG_VERBOSE,                      \
85           "%s "                                    \
86           "0x%02x,0x%02x,0x%02x,0x%02x,"           \
87           "0x%02x,0x%02x,0x%02x,0x%02x,"           \
88           "0x%02x,0x%02x,0x%02x,0x%02x,"           \
89           "0x%02x,0x%02x,0x%02x,0x%02x ",          \
90            s,                                      \
91            (x)[0],  (x)[1],  (x)[2],  (x)[3],      \
92            (x)[4],  (x)[5],  (x)[6],  (x)[7],      \
93            (x)[8],  (x)[9],  (x)[10], (x)[11],     \
94            (x)[12], (x)[13], (x)[14], (x)[15]);    \
95    av_log(pc, AV_LOG_INFO,                         \
96           "%s "                                    \
97           "%02x.%02x.%02x.%02x."                   \
98           "%02x.%02x.%02x.%02x."                   \
99           "%02x.%02x.%02x.%02x."                   \
100           "%02x.%02x.%02x.%02x\n",                 \
101            s,                                      \
102            (x)[0],  (x)[1],  (x)[2],  (x)[3],      \
103            (x)[4],  (x)[5],  (x)[6],  (x)[7],      \
104            (x)[8],  (x)[9],  (x)[10], (x)[11],     \
105            (x)[12], (x)[13], (x)[14], (x)[15])
106#else
107#define PRINT_KEY(pc, s, x)
108#endif
109
110#endif /* AVFORMAT_MXF_H */
111