lxfdec.c
Go to the documentation of this file.
1 /*
2  * LXF demuxer
3  * Copyright (c) 2010 Tomas Härdin
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 #include "libavutil/intreadwrite.h"
23 #include "libavcodec/bytestream.h"
24 #include "avformat.h"
25 #include "internal.h"
26 
27 #define LXF_MAX_PACKET_HEADER_SIZE 256
28 #define LXF_HEADER_DATA_SIZE 120
29 #define LXF_IDENT "LEITCH\0"
30 #define LXF_IDENT_LENGTH 8
31 #define LXF_SAMPLERATE 48000
32 #define LXF_MAX_AUDIO_PACKET (8008*15*4) ///< 15-channel 32-bit NTSC audio frame
33 
34 static const AVCodecTag lxf_tags[] = {
35  { AV_CODEC_ID_MJPEG, 0 },
37  { AV_CODEC_ID_MPEG2VIDEO, 2 }, //MpMl, 4:2:0
38  { AV_CODEC_ID_MPEG2VIDEO, 3 }, //MpPl, 4:2:2
39  { AV_CODEC_ID_DVVIDEO, 4 }, //DV25
40  { AV_CODEC_ID_DVVIDEO, 5 }, //DVCPRO
41  { AV_CODEC_ID_DVVIDEO, 6 }, //DVCPRO50
42  { AV_CODEC_ID_RAWVIDEO, 7 }, //AV_PIX_FMT_ARGB, where alpha is used for chroma keying
43  { AV_CODEC_ID_RAWVIDEO, 8 }, //16-bit chroma key
44  { AV_CODEC_ID_MPEG2VIDEO, 9 }, //4:2:2 CBP ("Constrained Bytes per Gop")
45  { AV_CODEC_ID_NONE, 0 },
46 };
47 
48 typedef struct {
49  int channels; ///< number of audio channels. zero means no audio
50  int frame_number; ///< current video frame
51  uint32_t video_format, packet_type, extended_size;
53 
54 static int lxf_probe(AVProbeData *p)
55 {
56  if (!memcmp(p->buf, LXF_IDENT, LXF_IDENT_LENGTH))
57  return AVPROBE_SCORE_MAX;
58 
59  return 0;
60 }
61 
62 /**
63  * Verify the checksum of an LXF packet header
64  *
65  * @param[in] header the packet header to check
66  * @return zero if the checksum is OK, non-zero otherwise
67  */
68 static int check_checksum(const uint8_t *header, int size)
69 {
70  int x;
71  uint32_t sum = 0;
72 
73  for (x = 0; x < size; x += 4)
74  sum += AV_RL32(&header[x]);
75 
76  return sum;
77 }
78 
79 /**
80  * Read input until we find the next ident. If found, copy it to the header buffer
81  *
82  * @param[out] header where to copy the ident to
83  * @return 0 if an ident was found, < 0 on I/O error
84  */
85 static int sync(AVFormatContext *s, uint8_t *header)
86 {
88  int ret;
89 
90  if ((ret = avio_read(s->pb, buf, LXF_IDENT_LENGTH)) != LXF_IDENT_LENGTH)
91  return ret < 0 ? ret : AVERROR_EOF;
92 
93  while (memcmp(buf, LXF_IDENT, LXF_IDENT_LENGTH)) {
94  if (url_feof(s->pb))
95  return AVERROR_EOF;
96 
97  memmove(buf, &buf[1], LXF_IDENT_LENGTH-1);
98  buf[LXF_IDENT_LENGTH-1] = avio_r8(s->pb);
99  }
100 
101  memcpy(header, LXF_IDENT, LXF_IDENT_LENGTH);
102 
103  return 0;
104 }
105 
106 /**
107  * Read and checksum the next packet header
108  *
109  * @return the size of the payload following the header or < 0 on failure
110  */
112 {
113  LXFDemuxContext *lxf = s->priv_data;
114  AVIOContext *pb = s->pb;
115  int track_size, samples, ret;
116  uint32_t version, audio_format, header_size, channels, tmp;
117  AVStream *st;
119  const uint8_t *p;
120 
121  //find and read the ident
122  if ((ret = sync(s, header)) < 0)
123  return ret;
124 
125  ret = avio_read(pb, header + LXF_IDENT_LENGTH, 8);
126  if (ret != 8)
127  return ret < 0 ? ret : AVERROR_EOF;
128 
129  p = header + LXF_IDENT_LENGTH;
130  version = bytestream_get_le32(&p);
131  header_size = bytestream_get_le32(&p);
132  if (version > 1)
133  avpriv_request_sample(s, "format version %i", version);
134  if (header_size < (version ? 72 : 60) ||
135  header_size > LXF_MAX_PACKET_HEADER_SIZE ||
136  (header_size & 3)) {
137  av_log(s, AV_LOG_ERROR, "Invalid header size 0x%x\n", header_size);
138  return AVERROR_INVALIDDATA;
139  }
140 
141  //read the rest of the packet header
142  if ((ret = avio_read(pb, header + (p - header),
143  header_size - (p - header))) !=
144  header_size - (p - header)) {
145  return ret < 0 ? ret : AVERROR_EOF;
146  }
147 
148  if (check_checksum(header, header_size))
149  av_log(s, AV_LOG_ERROR, "checksum error\n");
150 
151  lxf->packet_type = bytestream_get_le32(&p);
152  p += version ? 20 : 12;
153 
154  lxf->extended_size = 0;
155  switch (lxf->packet_type) {
156  case 0:
157  //video
158  lxf->video_format = bytestream_get_le32(&p);
159  ret = bytestream_get_le32(&p);
160  //skip VBI data and metadata
161  avio_skip(pb, (int64_t)(uint32_t)AV_RL32(p + 4) +
162  (int64_t)(uint32_t)AV_RL32(p + 12));
163  break;
164  case 1:
165  //audio
166  if (!s->streams || !(st = s->streams[1])) {
167  av_log(s, AV_LOG_INFO, "got audio packet, but no audio stream present\n");
168  break;
169  }
170 
171  if (version == 0) p += 8;
172  audio_format = bytestream_get_le32(&p);
173  channels = bytestream_get_le32(&p);
174  track_size = bytestream_get_le32(&p);
175 
176  //set codec based on specified audio bitdepth
177  //we only support tightly packed 16-, 20-, 24- and 32-bit PCM at the moment
178  st->codec->bits_per_coded_sample = (audio_format >> 6) & 0x3F;
179 
180  if (st->codec->bits_per_coded_sample != (audio_format & 0x3F)) {
181  av_log(s, AV_LOG_WARNING, "only tightly packed PCM currently supported\n");
182  return AVERROR_PATCHWELCOME;
183  }
184 
185  switch (st->codec->bits_per_coded_sample) {
186  case 16: st->codec->codec_id = AV_CODEC_ID_PCM_S16LE_PLANAR; break;
187  case 20: st->codec->codec_id = AV_CODEC_ID_PCM_LXF; break;
188  case 24: st->codec->codec_id = AV_CODEC_ID_PCM_S24LE_PLANAR; break;
189  case 32: st->codec->codec_id = AV_CODEC_ID_PCM_S32LE_PLANAR; break;
190  default:
192  "only 16-, 20-, 24- and 32-bit PCM currently supported\n");
193  return AVERROR_PATCHWELCOME;
194  }
195 
196  samples = track_size * 8 / st->codec->bits_per_coded_sample;
197 
198  //use audio packet size to determine video standard
199  //for NTSC we have one 8008-sample audio frame per five video frames
200  if (samples == LXF_SAMPLERATE * 5005 / 30000) {
201  avpriv_set_pts_info(s->streams[0], 64, 1001, 30000);
202  } else {
203  //assume PAL, but warn if we don't have 1920 samples
204  if (samples != LXF_SAMPLERATE / 25)
206  "video doesn't seem to be PAL or NTSC. guessing PAL\n");
207 
208  avpriv_set_pts_info(s->streams[0], 64, 1, 25);
209  }
210 
211  //TODO: warning if track mask != (1 << channels) - 1?
212  ret = av_popcount(channels) * track_size;
213 
214  break;
215  default:
216  tmp = bytestream_get_le32(&p);
217  ret = bytestream_get_le32(&p);
218  if (tmp == 1)
219  lxf->extended_size = bytestream_get_le32(&p);
220  break;
221  }
222 
223  return ret;
224 }
225 
227 {
228  LXFDemuxContext *lxf = s->priv_data;
229  AVIOContext *pb = s->pb;
230  uint8_t header_data[LXF_HEADER_DATA_SIZE];
231  int ret;
232  AVStream *st;
233  uint32_t video_params, disk_params;
234  uint16_t record_date, expiration_date;
235 
236  if ((ret = get_packet_header(s)) < 0)
237  return ret;
238 
239  if (ret != LXF_HEADER_DATA_SIZE) {
240  av_log(s, AV_LOG_ERROR, "expected %d B size header, got %d\n",
241  LXF_HEADER_DATA_SIZE, ret);
242  return AVERROR_INVALIDDATA;
243  }
244 
245  if ((ret = avio_read(pb, header_data, LXF_HEADER_DATA_SIZE)) != LXF_HEADER_DATA_SIZE)
246  return ret < 0 ? ret : AVERROR_EOF;
247 
248  if (!(st = avformat_new_stream(s, NULL)))
249  return AVERROR(ENOMEM);
250 
251  st->duration = AV_RL32(&header_data[32]);
252  video_params = AV_RL32(&header_data[40]);
253  record_date = AV_RL16(&header_data[56]);
254  expiration_date = AV_RL16(&header_data[58]);
255  disk_params = AV_RL32(&header_data[116]);
256 
258  st->codec->bit_rate = 1000000 * ((video_params >> 14) & 0xFF);
259  st->codec->codec_tag = video_params & 0xF;
260  st->codec->codec_id = ff_codec_get_id(lxf_tags, st->codec->codec_tag);
261 
262  av_log(s, AV_LOG_DEBUG, "record: %x = %i-%02i-%02i\n",
263  record_date, 1900 + (record_date & 0x7F), (record_date >> 7) & 0xF,
264  (record_date >> 11) & 0x1F);
265 
266  av_log(s, AV_LOG_DEBUG, "expire: %x = %i-%02i-%02i\n",
267  expiration_date, 1900 + (expiration_date & 0x7F), (expiration_date >> 7) & 0xF,
268  (expiration_date >> 11) & 0x1F);
269 
270  if ((video_params >> 22) & 1)
271  av_log(s, AV_LOG_WARNING, "VBI data not yet supported\n");
272 
273  if ((lxf->channels = 1 << (disk_params >> 4 & 3) + 1)) {
274  if (!(st = avformat_new_stream(s, NULL)))
275  return AVERROR(ENOMEM);
276 
279  st->codec->channels = lxf->channels;
280 
281  avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
282  }
283 
284  avio_skip(s->pb, lxf->extended_size);
285 
286  return 0;
287 }
288 
290 {
291  LXFDemuxContext *lxf = s->priv_data;
292  AVIOContext *pb = s->pb;
293  AVStream *ast = NULL;
294  uint32_t stream;
295  int ret, ret2;
296 
297  if ((ret = get_packet_header(s)) < 0)
298  return ret;
299 
300  stream = lxf->packet_type;
301 
302  if (stream > 1) {
303  av_log(s, AV_LOG_WARNING, "got packet with illegal stream index %u\n", stream);
304  return AVERROR(EAGAIN);
305  }
306 
307  if (stream == 1 && !(ast = s->streams[1])) {
308  av_log(s, AV_LOG_ERROR, "got audio packet without having an audio stream\n");
309  return AVERROR_INVALIDDATA;
310  }
311 
312  //make sure the data fits in the de-planerization buffer
313  if (ast && ret > LXF_MAX_AUDIO_PACKET) {
314  av_log(s, AV_LOG_ERROR, "audio packet too large (%i > %i)\n",
315  ret, LXF_MAX_AUDIO_PACKET);
316  return AVERROR_INVALIDDATA;
317  }
318 
319  if ((ret2 = av_new_packet(pkt, ret)) < 0)
320  return ret2;
321 
322  if ((ret2 = avio_read(pb, pkt->data, ret)) != ret) {
323  av_free_packet(pkt);
324  return ret2 < 0 ? ret2 : AVERROR_EOF;
325  }
326 
327  pkt->stream_index = stream;
328 
329  if (!ast) {
330  //picture type (0 = closed I, 1 = open I, 2 = P, 3 = B)
331  if (((lxf->video_format >> 22) & 0x3) < 2)
332  pkt->flags |= AV_PKT_FLAG_KEY;
333 
334  pkt->dts = lxf->frame_number++;
335  }
336 
337  return ret;
338 }
339 
341  .name = "lxf",
342  .long_name = NULL_IF_CONFIG_SMALL("VR native stream (LXF)"),
343  .priv_data_size = sizeof(LXFDemuxContext),
347  .codec_tag = (const AVCodecTag* const []){lxf_tags, 0},
348 };
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
void av_free_packet(AVPacket *pkt)
Free a packet.
Definition: avpacket.c:242
int frame_number
current video frame
Definition: lxfdec.c:50
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
static int sync(AVFormatContext *s, uint8_t *header)
Read input until we find the next ident.
Definition: lxfdec.c:85
#define AV_RL16
static int check_checksum(const uint8_t *header, int size)
Verify the checksum of an LXF packet header.
Definition: lxfdec.c:68
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
int version
Definition: avisynth_c.h:666
AVInputFormat ff_lxf_demuxer
Definition: lxfdec.c:340
int channels
number of audio channels. zero means no audio
Definition: lxfdec.c:49
Format I/O context.
Definition: avformat.h:944
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
uint8_t
#define LXF_MAX_AUDIO_PACKET
15-channel 32-bit NTSC audio frame
Definition: lxfdec.c:32
static AVPacket pkt
Definition: demuxing.c:56
static int lxf_read_header(AVFormatContext *s)
Definition: lxfdec.c:226
#define LXF_IDENT
Definition: lxfdec.c:29
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
Definition: avformat.h:992
uint8_t * data
#define AVERROR_EOF
End of file.
Definition: error.h:55
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int lxf_probe(AVProbeData *p)
Definition: lxfdec.c:54
Discrete Time axis x
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:73
uint32_t packet_type
Definition: lxfdec.c:51
#define LXF_IDENT_LENGTH
Definition: lxfdec.c:30
uint32_t video_format
Definition: lxfdec.c:51
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int size
int flags
A combination of AV_PKT_FLAG values.
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
int bit_rate
the average bitrate
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
#define AV_RL32
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
preferred ID for MPEG-1/2 video decoding
#define LXF_MAX_PACKET_HEADER_SIZE
Definition: lxfdec.c:27
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
#define LXF_HEADER_DATA_SIZE
Definition: lxfdec.c:28
NULL
Definition: eval.c:55
uint32_t extended_size
Definition: lxfdec.c:51
enum AVMediaType codec_type
enum AVCodecID codec_id
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static int lxf_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: lxfdec.c:289
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> (&#39;D&#39;<<24) + (&#39;C&#39;<<16) + (&#39;B&#39;<<8) + &#39;A&#39;).
void * buf
Definition: avisynth_c.h:594
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
static int get_packet_header(AVFormatContext *s)
Read and checksum the next packet header.
Definition: lxfdec.c:111
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
static const AVCodecTag lxf_tags[]
Definition: lxfdec.c:34
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:696
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
Main libavformat public API header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
#define AV_LOG_INFO
Definition: log.h:156
Filter the word “frame” indicates either a video frame or a group of audio samples
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
This structure stores compressed data.
#define LXF_SAMPLERATE
Definition: lxfdec.c:31