FFmpeg
Loading...
Searching...
No Matches
avienc.c
Go to the documentation of this file.
1/*
2 * AVI muxer
3 * Copyright (c) 2000 Fabrice Bellard
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 <math.h>
23
24#include "avformat.h"
25#include "internal.h"
26#include "avi.h"
27#include "avio_internal.h"
29#include "riff.h"
30#include "mpegts.h"
31#include "mux.h"
32#include "rawutils.h"
34#include "libavutil/avstring.h"
35#include "libavutil/avutil.h"
36#include "libavutil/internal.h"
37#include "libavutil/dict.h"
38#include "libavutil/avassert.h"
39#include "libavutil/mem.h"
40#include "libavutil/timestamp.h"
41#include "libavutil/opt.h"
42#include "libavutil/pixdesc.h"
43#include "libavcodec/raw.h"
44
45/*
46 * TODO:
47 * - fill all fields if non streamed (nb_frames for example)
48 */
49
50typedef struct AVIIentry {
51 char tag[4];
52 unsigned int flags;
53 unsigned int pos;
54 unsigned int len;
55} AVIIentry;
56
57#define AVI_INDEX_CLUSTER_SIZE 16384
58#define AVI_MASTER_INDEX_PREFIX_SIZE (8+2+1+1+4+8+4+4)
59#define AVI_MASTER_INDEX_ENTRY_SIZE 16 /* bytes per entry */
60#define AVI_MASTER_INDEX_SIZE_DEFAULT 256 /* number of entries */
61
70
71typedef struct AVIContext {
72 const AVClass *class;
82
83typedef struct AVIStream {
87 int entry;
90
92
94
96
100} AVIStream;
101
103
104static inline AVIIentry *avi_get_ientry(const AVIIndex *idx, int ent_id)
105{
106 int cl = ent_id / AVI_INDEX_CLUSTER_SIZE;
107 int id = ent_id % AVI_INDEX_CLUSTER_SIZE;
108 return &idx->cluster[cl][id];
109}
110
111static int avi_add_ientry(AVFormatContext *s, int stream_index, char *tag,
112 unsigned int flags, unsigned int size)
113{
114 AVIContext *avi = s->priv_data;
115 AVIOContext *pb = s->pb;
116 AVIStream *avist = s->streams[stream_index]->priv_data;
117 AVIIndex *idx = &avist->indexes;
118 int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE;
119 int id = idx->entry % AVI_INDEX_CLUSTER_SIZE;
120
121 if (idx->ents_allocated <= idx->entry) {
122 idx->cluster = av_realloc_f(idx->cluster, sizeof(void*), cl+1);
123 if (!idx->cluster) {
124 idx->ents_allocated = 0;
125 idx->entry = 0;
126 return AVERROR(ENOMEM);
127 }
128 idx->cluster[cl] =
130 if (!idx->cluster[cl])
131 return AVERROR(ENOMEM);
133 }
134
135 if (tag)
136 memcpy(idx->cluster[cl][id].tag, tag, 4);
137 else
138 memset(idx->cluster[cl][id].tag, 0, 4);
139 idx->cluster[cl][id].flags = flags;
140 idx->cluster[cl][id].pos = avio_tell(pb) - avi->movi_list;
141 idx->cluster[cl][id].len = size;
142 avist->max_size = FFMAX(avist->max_size, size);
143 idx->entry++;
144
145 return 0;
146}
147
149{
150 AVIContext *avi = s->priv_data;
151
152 if (avi->reserve_index_space > 0) {
155 } else
157 av_log(s, AV_LOG_DEBUG, "reserve_index_space:%d master_index_max_size:%d\n",
159
160 return 1; /* stream initialization continues in avi_write_header */
161}
162
164 const char *riff_tag, const char *list_tag)
165{
166 AVIContext *avi = s->priv_data;
167 int64_t loff;
168 int i;
169
170 avi->riff_id++;
171 for (i = 0; i < s->nb_streams; i++) {
172 AVIStream *avist = s->streams[i]->priv_data;
174 avist->indexes.entry = 0;
175 }
176
177 avi->riff_start = ff_start_tag(pb, "RIFF");
178 ffio_wfourcc(pb, riff_tag);
179 loff = ff_start_tag(pb, "LIST");
180 ffio_wfourcc(pb, list_tag);
181 return loff;
182}
183
184static char *avi_stream2fourcc(char *tag, int index, enum AVMediaType type)
185{
186 tag[0] = '0' + index / 10;
187 tag[1] = '0' + index % 10;
188 if (type == AVMEDIA_TYPE_VIDEO) {
189 tag[2] = 'd';
190 tag[3] = 'c';
191 } else if (type == AVMEDIA_TYPE_SUBTITLE) {
192 // note: this is not an official code
193 tag[2] = 's';
194 tag[3] = 'b';
195 } else {
196 tag[2] = 'w';
197 tag[3] = 'b';
198 }
199 tag[4] = '\0';
200 return tag;
201}
202
203static int avi_write_counters(AVFormatContext *s, int riff_id)
204{
205 AVIOContext *pb = s->pb;
206 AVIContext *avi = s->priv_data;
207 int n, au_byterate, au_ssize, au_scale, nb_frames = 0;
208 int64_t file_size;
210
211 file_size = avio_tell(pb);
212 for (n = 0; n < s->nb_streams; n++) {
213 AVIStream *avist = s->streams[n]->priv_data;
214
216 par = s->streams[n]->codecpar;
217 avio_seek(pb, avist->frames_hdr_strm, SEEK_SET);
218 ff_parse_specific_params(s->streams[n], &au_byterate, &au_ssize, &au_scale);
219 if (au_ssize == 0)
220 avio_wl32(pb, avist->packet_count);
221 else
222 avio_wl32(pb, avist->audio_strm_length / au_ssize);
223 if (par->codec_type == AVMEDIA_TYPE_VIDEO)
224 nb_frames = FFMAX(nb_frames, avist->packet_count);
225 }
226 if (riff_id == 1) {
228 avio_seek(pb, avi->frames_hdr_all, SEEK_SET);
229 avio_wl32(pb, nb_frames);
230 }
231 avio_seek(pb, file_size, SEEK_SET);
232
233 return 0;
234}
235
236static void write_odml_master(AVFormatContext *s, int stream_index)
237{
238 AVIOContext *pb = s->pb;
239 AVIContext *avi = s->priv_data;
240 AVStream *st = s->streams[stream_index];
241 AVCodecParameters *par = st->codecpar;
242 AVIStream *avist = st->priv_data;
243 unsigned char tag[5];
244
245 /* Starting to lay out AVI OpenDML master index.
246 * We want to make it JUNK entry for now, since we'd
247 * like to get away without making AVI an OpenDML one
248 * for compatibility reasons. */
249 avist->indexes.indx_start = ff_start_tag(pb, "JUNK");
250 avio_wl16(pb, 4); /* wLongsPerEntry */
251 avio_w8(pb, 0); /* bIndexSubType (0 == frame index) */
252 avio_w8(pb, 0); /* bIndexType (0 == AVI_INDEX_OF_INDEXES) */
253 avio_wl32(pb, 0); /* nEntriesInUse (will fill out later on) */
254 ffio_wfourcc(pb, avi_stream2fourcc(tag, stream_index, par->codec_type));
255 /* dwChunkId */
256 ffio_fill(pb, 0, 3 * 4 /* dwReserved[3] */
257 + 16LL * avi->master_index_max_size);
258 ff_end_tag(pb, avist->indexes.indx_start);
259}
260
262{
263 AVIContext *avi = s->priv_data;
264 AVIOContext *pb = s->pb;
265 int bitrate, n, i, nb_frames, au_byterate, au_ssize, au_scale;
266 int64_t max_stream_duration = 0;
267 AVCodecParameters *video_par;
269 int64_t list1, list2, strh, strf;
271 int padding;
272
273 if (s->nb_streams > AVI_MAX_STREAM_COUNT) {
274 av_log(s, AV_LOG_ERROR, "AVI does not support "
275 ">"AV_STRINGIFY(AVI_MAX_STREAM_COUNT)" streams\n");
276 return AVERROR(EINVAL);
277 }
278
280
281 for (n = 0; n < s->nb_streams; n++) {
282 s->streams[n]->priv_data = av_mallocz(sizeof(AVIStream));
283 if (!s->streams[n]->priv_data)
284 return AVERROR(ENOMEM);
285 }
286
287 /* header list */
288 avi->riff_id = 0;
289 list1 = avi_start_new_riff(s, pb, "AVI ", "hdrl");
290
291 /* avi header */
292 ffio_wfourcc(pb, "avih");
293 avio_wl32(pb, 14 * 4);
294 bitrate = 0;
295
296 video_par = NULL;
297 for (n = 0; n < s->nb_streams; n++) {
298 AVCodecParameters *par = s->streams[n]->codecpar;
299 AVStream *st = s->streams[n];
300 bitrate = FFMIN(bitrate + par->bit_rate, INT32_MAX);
301 if (st->duration > 0) {
302 int64_t stream_duration = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
303 max_stream_duration = FFMAX(stream_duration, max_stream_duration);
304 }
305 if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
306 video_par = par;
307 video_st = st;
308 }
309 }
310
311 /* guess master index size based on bitrate and duration */
312 if (!avi->reserve_index_space) {
313 double duration_est, filesize_est;
314 if (s->duration > 0)
315 duration_est = (double)s->duration / AV_TIME_BASE;
316 else if (max_stream_duration > 0)
317 duration_est = (double)max_stream_duration / AV_TIME_BASE;
318 else
319 duration_est = 10 * 60 * 60; /* default to 10 hours */
320 filesize_est = duration_est * (bitrate / 8) * 1.10; /* add 10% safety margin for muxer+bitrate */
321 avi->master_index_max_size = FFMAX((int)ceil(filesize_est / AVI_MAX_RIFF_SIZE) + 1,
323 av_log(s, AV_LOG_DEBUG, "duration_est:%0.3f, filesize_est:%0.1fGiB, master_index_max_size:%d\n",
324 duration_est, filesize_est / (1024*1024*1024), avi->master_index_max_size);
325 }
326
327 nb_frames = 0;
328
329 // TODO: should be avg_frame_rate
330 if (video_st)
331 avio_wl32(pb, (uint32_t) (INT64_C(1000000) * video_st->time_base.num /
332 video_st->time_base.den));
333 else
334 avio_wl32(pb, 0);
335 avio_wl32(pb, bitrate / 8); /* XXX: not quite exact */
336 avio_wl32(pb, 0); /* padding */
337 if (!(pb->seekable & AVIO_SEEKABLE_NORMAL))
339 else
341 avi->frames_hdr_all = avio_tell(pb); /* remember this offset to fill later */
342 avio_wl32(pb, nb_frames); /* nb frames, filled later */
343 avio_wl32(pb, 0); /* initial frame */
344 avio_wl32(pb, s->nb_streams); /* nb streams */
345 avio_wl32(pb, 1024 * 1024); /* suggested buffer size */
346 if (video_par) {
347 avio_wl32(pb, video_par->width);
348 avio_wl32(pb, video_par->height);
349 } else {
350 avio_wl32(pb, 0);
351 avio_wl32(pb, 0);
352 }
353 ffio_fill(pb, 0, 4 * 4); /* reserved */
354
355 /* stream list */
356 for (i = 0; i < n; i++) {
357 AVStream *st = s->streams[i];
358 AVCodecParameters *par = st->codecpar;
359 AVIStream *avist = st->priv_data;
360 list2 = ff_start_tag(pb, "LIST");
361 ffio_wfourcc(pb, "strl");
362
363 /* stream generic header */
364 strh = ff_start_tag(pb, "strh");
365 switch (par->codec_type) {
367 // XSUB subtitles behave like video tracks, other subtitles
368 // are not (yet) supported.
369 if (par->codec_id != AV_CODEC_ID_XSUB) {
370 avpriv_report_missing_feature(s, "Subtitle streams other than DivX XSUB");
372 }
375 ffio_wfourcc(pb, "vids");
376 break;
378 ffio_wfourcc(pb, "auds");
379 break;
380// case AVMEDIA_TYPE_TEXT:
381// ffio_wfourcc(pb, "txts");
382// break;
384 ffio_wfourcc(pb, "dats");
385 break;
386 }
387 if (par->codec_type == AVMEDIA_TYPE_VIDEO ||
389 avio_wl32(pb, par->codec_tag);
390 else
391 avio_wl32(pb, 1);
392 avist->strh_flags_offset = avio_tell(pb);
393 avio_wl32(pb, 0); /* flags */
394 avio_wl16(pb, 0); /* priority */
395 avio_wl16(pb, 0); /* language */
396 avio_wl32(pb, 0); /* initial frame */
397
398 ff_parse_specific_params(st, &au_byterate, &au_ssize, &au_scale);
399
400 if ( par->codec_type == AVMEDIA_TYPE_VIDEO
401 && par->codec_id != AV_CODEC_ID_XSUB
402 && au_byterate > 1000LL*au_scale) {
403 au_byterate = 600;
404 au_scale = 1;
405 }
406 avpriv_set_pts_info(st, 64, au_scale, au_byterate);
407 if (par->codec_id == AV_CODEC_ID_XSUB)
408 au_scale = au_byterate = 0;
409
410 avio_wl32(pb, au_scale); /* scale */
411 avio_wl32(pb, au_byterate); /* rate */
412
413 avio_wl32(pb, 0); /* start */
414 /* remember this offset to fill later */
415 avist->frames_hdr_strm = avio_tell(pb);
416 if (!(pb->seekable & AVIO_SEEKABLE_NORMAL))
417 /* FIXME: this may be broken, but who cares */
419 else
420 avio_wl32(pb, 0); /* length, XXX: filled later */
421
422 /* suggested buffer size, is set to largest chunk size in avi_write_trailer */
423 if (par->codec_type == AVMEDIA_TYPE_VIDEO)
424 avio_wl32(pb, 1024 * 1024);
425 else if (par->codec_type == AVMEDIA_TYPE_AUDIO)
426 avio_wl32(pb, 12 * 1024);
427 else
428 avio_wl32(pb, 0);
429 avio_wl32(pb, -1); /* quality */
430 avio_wl32(pb, au_ssize); /* sample size */
431 avio_wl32(pb, 0);
432 if (par->width > 65535 || par->height > 65535) {
433 av_log(s, AV_LOG_ERROR, "%dx%d dimensions are too big\n", par->width, par->height);
434 return AVERROR(EINVAL);
435 }
436 avio_wl16(pb, par->width);
437 avio_wl16(pb, par->height);
438 ff_end_tag(pb, strh);
439
440 if (par->codec_type != AVMEDIA_TYPE_DATA) {
441 int ret, flags;
443
444 strf = ff_start_tag(pb, "strf");
445 switch (par->codec_type) {
447 /* XSUB subtitles behave like video tracks, other subtitles
448 * are not (yet) supported. */
449 if (par->codec_id != AV_CODEC_ID_XSUB)
450 break;
453 /* WMP expects RGB 5:5:5 rawvideo in avi to have bpp set to 16. */
454 if ( !par->codec_tag
456 && par->format == AV_PIX_FMT_RGB555LE
457 && par->bits_per_coded_sample == 15)
458 par->bits_per_coded_sample = 16;
459 avist->pal_offset = avio_tell(pb) + 40;
460 ff_put_bmp_header(pb, par, 0, 0, avi->flipped_raw_rgb);
463 if ( !par->codec_tag
465 && par->format != pix_fmt
466 && par->format != AV_PIX_FMT_NONE)
467 av_log(s, AV_LOG_ERROR, "%s rawvideo cannot be written to avi, output file will be unreadable\n",
469
470 if (par->format == AV_PIX_FMT_PAL8) {
471 if (par->bits_per_coded_sample < 0 || par->bits_per_coded_sample > 8) {
472 av_log(s, AV_LOG_ERROR, "PAL8 with %d bps is not allowed\n", par->bits_per_coded_sample);
473 return AVERROR(EINVAL);
474 }
475 }
476
477 break;
480 if ((ret = ff_put_wav_header(s, pb, par, flags)) < 0)
481 return ret;
482 break;
483 default:
485 "Invalid or not supported codec type '%s' found in the input\n",
487 return AVERROR(EINVAL);
488 }
489 ff_end_tag(pb, strf);
490 if ((t = av_dict_get(st->metadata, "title", NULL, 0))) {
491 ff_riff_write_info_tag(s->pb, "strn", t->value);
492 t = NULL;
493 }
494 if (par->codec_id == AV_CODEC_ID_XSUB
495 && (t = av_dict_get(s->streams[i]->metadata, "language", NULL, 0))) {
496 const char* langstr = ff_convert_lang_to(t->value, AV_LANG_ISO639_1);
497 t = NULL;
498 if (langstr) {
499 char* str = av_asprintf("Subtitle - %s-xx;02", langstr);
500 if (!str)
501 return AVERROR(ENOMEM);
502 ff_riff_write_info_tag(s->pb, "strn", str);
503 av_free(str);
504 }
505 }
506 }
507
508 if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
510 }
511
512 if (par->codec_type == AVMEDIA_TYPE_VIDEO &&
513 st->sample_aspect_ratio.num > 0 &&
514 st->sample_aspect_ratio.den > 0) {
515 int vprp = ff_start_tag(pb, "vprp");
517 (AVRational) { par->width,
518 par->height });
519 int num, den, fields, i;
520 av_reduce(&num, &den, dar.num, dar.den, 0xFFFF);
521 if (par->field_order == AV_FIELD_TT || par->field_order == AV_FIELD_BB ||
522 par->field_order == AV_FIELD_TB || par->field_order == AV_FIELD_BT) {
523 fields = 2; // interlaced
524 } else {
525 fields = 1; // progressive
526 }
527
528 avio_wl32(pb, 0); // video format = unknown
529 avio_wl32(pb, 0); // video standard = unknown
530 // TODO: should be avg_frame_rate
531 avio_wl32(pb, (2LL*st->time_base.den + st->time_base.num - 1) / (2LL * st->time_base.num));
532 avio_wl32(pb, par->width);
533 avio_wl32(pb, par->height);
534 avio_wl16(pb, den);
535 avio_wl16(pb, num);
536 avio_wl32(pb, par->width);
537 avio_wl32(pb, par->height);
538 avio_wl32(pb, fields); // fields per frame
539
540 for (i = 0; i < fields; i++) {
541 int start_line;
542 // OpenDML v1.02 is not very specific on what value to use for
543 // start_line when frame data is not coming from a capturing device,
544 // so just use 0/1 depending on the field order for interlaced frames
545 if (par->field_order == AV_FIELD_TT || par->field_order == AV_FIELD_TB) {
546 start_line = (i == 0) ? 0 : 1;
547 } else if (par->field_order == AV_FIELD_BB || par->field_order == AV_FIELD_BT) {
548 start_line = (i == 0) ? 1 : 0;
549 } else {
550 start_line = 0;
551 }
552
553 avio_wl32(pb, par->height / fields); // compressed bitmap height
554 avio_wl32(pb, par->width); // compressed bitmap width
555 avio_wl32(pb, par->height / fields); // valid bitmap height
556 avio_wl32(pb, par->width); // valid bitmap width
557 avio_wl32(pb, 0); // valid bitmap X offset
558 avio_wl32(pb, 0); // valid bitmap Y offset
559 avio_wl32(pb, 0); // valid X offset in T
560 avio_wl32(pb, start_line); // valid Y start line
561 }
562 ff_end_tag(pb, vprp);
563 }
564
565 ff_end_tag(pb, list2);
566 }
567
568 if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
569 /* AVI could become an OpenDML one, if it grows beyond 2Gb range */
570 avi->odml_list = ff_start_tag(pb, "JUNK");
571 ffio_wfourcc(pb, "odml");
572 ffio_wfourcc(pb, "dmlh");
573 avio_wl32(pb, 248);
574 ffio_fill(pb, 0, 248);
575 ff_end_tag(pb, avi->odml_list);
576 }
577
578 ff_end_tag(pb, list1);
579
581
582
583 padding = s->metadata_header_padding;
584 if (padding < 0)
585 padding = 1016;
586
587 /* some padding for easier tag editing */
588 if (padding) {
589 list2 = ff_start_tag(pb, "JUNK");
590 ffio_fill(pb, 0, FFALIGN((uint32_t)padding, 4));
591 ff_end_tag(pb, list2);
592 }
593
594 avi->movi_list = ff_start_tag(pb, "LIST");
595 ffio_wfourcc(pb, "movi");
596
597 return 0;
598}
599
600static void update_odml_entry(AVFormatContext *s, int stream_index, int64_t ix, int size)
601{
602 AVIOContext *pb = s->pb;
603 AVIContext *avi = s->priv_data;
604 AVIStream *avist = s->streams[stream_index]->priv_data;
605 int64_t pos;
606 int au_byterate, au_ssize, au_scale;
607
608 pos = avio_tell(pb);
609
610 /* Updating one entry in the AVI OpenDML master index */
611 avio_seek(pb, avist->indexes.indx_start - 8, SEEK_SET);
612 ffio_wfourcc(pb, "indx"); /* enabling this entry */
613 avio_skip(pb, 8);
614 avio_wl32(pb, avi->riff_id - avist->indexes.master_odml_riff_id_base); /* nEntriesInUse */
615 avio_skip(pb, 16 * (avi->riff_id - avist->indexes.master_odml_riff_id_base));
616 avio_wl64(pb, ix); /* qwOffset */
617 avio_wl32(pb, size); /* dwSize */
618 ff_parse_specific_params(s->streams[stream_index], &au_byterate, &au_ssize, &au_scale);
619 if (s->streams[stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && au_ssize > 0) {
620 uint32_t audio_segm_size = (avist->audio_strm_length - avist->indexes.audio_strm_offset);
621 if ((audio_segm_size % au_ssize > 0) && !avist->sample_requested) {
622 avpriv_request_sample(s, "OpenDML index duration for audio packets with partial frames");
623 avist->sample_requested = 1;
624 }
625 avio_wl32(pb, audio_segm_size / au_ssize); /* dwDuration (sample count) */
626 } else
627 avio_wl32(pb, avist->indexes.entry); /* dwDuration (packet count) */
628
629 avio_seek(pb, pos, SEEK_SET);
630}
631
633{
634 AVIOContext *pb = s->pb;
635 AVIContext *avi = s->priv_data;
636 char tag[5];
637 char ix_tag[] = "ix00";
638 int i, j;
639
641
642 for (i = 0; i < s->nb_streams; i++) {
643 AVIStream *avist = s->streams[i]->priv_data;
645 int64_t pos;
647
648 pos = avio_tell(pb);
651 av_assert1(avio_tell(pb) - pos == size);
652 avist->indexes.master_odml_riff_id_base = avi->riff_id - 1;
653 }
655 }
656
657 for (i = 0; i < s->nb_streams; i++) {
658 AVIStream *avist = s->streams[i]->priv_data;
659 int64_t ix;
660
661 avi_stream2fourcc(tag, i, s->streams[i]->codecpar->codec_type);
662 ix_tag[3] = '0' + i;
663
664 /* Writing AVI OpenDML leaf index chunk */
665 ix = avio_tell(pb);
666 ffio_wfourcc(pb, ix_tag); /* ix?? */
667 avio_wl32(pb, avist->indexes.entry * 8 + 24);
668 /* chunk size */
669 avio_wl16(pb, 2); /* wLongsPerEntry */
670 avio_w8(pb, 0); /* bIndexSubType (0 == frame index) */
671 avio_w8(pb, 1); /* bIndexType (1 == AVI_INDEX_OF_CHUNKS) */
672 avio_wl32(pb, avist->indexes.entry);
673 /* nEntriesInUse */
674 ffio_wfourcc(pb, tag); /* dwChunkId */
675 avio_wl64(pb, avi->movi_list); /* qwBaseOffset */
676 avio_wl32(pb, 0); /* dwReserved_3 (must be 0) */
677
678 for (j = 0; j < avist->indexes.entry; j++) {
679 AVIIentry *ie = avi_get_ientry(&avist->indexes, j);
680 avio_wl32(pb, ie->pos + 8);
681 avio_wl32(pb, ((uint32_t) ie->len & ~0x80000000) |
682 (ie->flags & 0x10 ? 0 : 0x80000000));
683 }
684
685 update_odml_entry(s, i, ix, avio_tell(pb) - ix);
686 }
687 return 0;
688}
689
691{
692 AVIOContext *pb = s->pb;
693 AVIContext *avi = s->priv_data;
694 int64_t idx_chunk;
695 int i;
696 char tag[5];
697
698 if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
699 AVIStream *avist;
700 AVIIentry *ie = 0, *tie;
701 int empty, stream_id = -1;
702
703 idx_chunk = ff_start_tag(pb, "idx1");
704 for (i = 0; i < s->nb_streams; i++) {
705 avist = s->streams[i]->priv_data;
706 avist->entry = 0;
707 }
708
709 do {
710 empty = 1;
711 for (i = 0; i < s->nb_streams; i++) {
712 avist = s->streams[i]->priv_data;
713 if (avist->indexes.entry <= avist->entry)
714 continue;
715
716 tie = avi_get_ientry(&avist->indexes, avist->entry);
717 if (empty || tie->pos < ie->pos) {
718 ie = tie;
719 stream_id = i;
720 }
721 empty = 0;
722 }
723 if (!empty) {
724 avist = s->streams[stream_id]->priv_data;
725 if (*ie->tag)
726 ffio_wfourcc(pb, ie->tag);
727 else {
728 avi_stream2fourcc(tag, stream_id,
729 s->streams[stream_id]->codecpar->codec_type);
730 ffio_wfourcc(pb, tag);
731 }
732 avio_wl32(pb, ie->flags);
733 avio_wl32(pb, ie->pos);
734 avio_wl32(pb, ie->len);
735 avist->entry++;
736 }
737 } while (!empty);
738 ff_end_tag(pb, idx_chunk);
739
741 }
742 return 0;
743}
744
745static int write_skip_frames(AVFormatContext *s, int stream_index, int64_t dts)
746{
747 AVIContext *avi = s->priv_data;
748 AVIStream *avist = s->streams[stream_index]->priv_data;
749 AVCodecParameters *par = s->streams[stream_index]->codecpar;
750
751 ff_dlog(s, "dts:%s packet_count:%d stream_index:%d\n", av_ts2str(dts), avist->packet_count, stream_index);
752 while (par->block_align == 0 && dts != AV_NOPTS_VALUE &&
753 dts > avist->packet_count && par->codec_id != AV_CODEC_ID_XSUB && avist->packet_count) {
754
755 if (dts - avist->packet_count > 60000) {
756 av_log(s, AV_LOG_ERROR, "Too large number of skipped frames %"PRId64" > 60000\n", dts - avist->packet_count);
757 return AVERROR(EINVAL);
758 }
759
760 avi->empty_packet->stream_index = stream_index;
762 ff_dlog(s, "dup dts:%s packet_count:%d\n", av_ts2str(dts), avist->packet_count);
763 }
764
765 return 0;
766}
767
769{
770 const int stream_index = pkt->stream_index;
771 AVCodecParameters *par = s->streams[stream_index]->codecpar;
772 int ret;
773
774 if (par->codec_id == AV_CODEC_ID_H264 && par->codec_tag == MKTAG('H','2','6','4') && pkt->size) {
775 ret = ff_check_h264_startcode(s, s->streams[stream_index], pkt);
776 if (ret < 0)
777 return ret;
778 }
779
780 if ((ret = write_skip_frames(s, stream_index, pkt->dts)) < 0)
781 return ret;
782
783 if (!pkt->size)
784 return avi_write_packet_internal(s, pkt); /* Passthrough */
785
786 if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
787 AVIStream *avist = s->streams[stream_index]->priv_data;
788 AVIOContext *pb = s->pb;
789 AVPacket *opkt = pkt;
790 int reshuffle_ret;
791 if (par->codec_id == AV_CODEC_ID_RAWVIDEO && par->codec_tag == 0) {
792 int64_t bpc = par->bits_per_coded_sample != 15 ? par->bits_per_coded_sample : 16;
793 int expected_stride = ((par->width * bpc + 31) >> 5)*4;
794 reshuffle_ret = ff_reshuffle_raw_rgb(s, &pkt, par, expected_stride);
795 if (reshuffle_ret < 0)
796 return reshuffle_ret;
797 } else
798 reshuffle_ret = 0;
799 if (par->format == AV_PIX_FMT_PAL8) {
800 ret = ff_get_packet_palette(s, opkt, reshuffle_ret, avist->palette);
801 if (ret < 0)
802 goto fail;
803 if (ret) {
804 int pal_size = 1 << par->bits_per_coded_sample;
805 int pc_tag, i;
806
808
809 if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && avist->pal_offset) {
810 int64_t cur_offset = avio_tell(pb);
811 avio_seek(pb, avist->pal_offset, SEEK_SET);
812 for (i = 0; i < pal_size; i++) {
813 uint32_t v = avist->palette[i];
814 avio_wl32(pb, v & 0xffffff);
815 }
816 avio_seek(pb, cur_offset, SEEK_SET);
817 memcpy(avist->old_palette, avist->palette, pal_size * 4);
818 avist->pal_offset = 0;
819 }
820 if (memcmp(avist->palette, avist->old_palette, pal_size * 4)) {
821 unsigned char tag[5];
822 avi_stream2fourcc(tag, stream_index, par->codec_type);
823 tag[2] = 'p'; tag[3] = 'c';
824 if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
825 if (avist->strh_flags_offset) {
826 int64_t cur_offset = avio_tell(pb);
827 avio_seek(pb, avist->strh_flags_offset, SEEK_SET);
829 avio_seek(pb, cur_offset, SEEK_SET);
830 avist->strh_flags_offset = 0;
831 }
832 ret = avi_add_ientry(s, stream_index, tag, AVIIF_NO_TIME,
833 pal_size * 4 + 4);
834 if (ret < 0)
835 goto fail;
836 }
837 pc_tag = ff_start_tag(pb, tag);
838 avio_w8(pb, 0);
839 avio_w8(pb, pal_size & 0xFF);
840 avio_wl16(pb, 0); // reserved
841 for (i = 0; i < pal_size; i++) {
842 uint32_t v = avist->palette[i];
843 avio_wb32(pb, v<<8);
844 }
845 ff_end_tag(pb, pc_tag);
846 memcpy(avist->old_palette, avist->palette, pal_size * 4);
847 }
848 }
849 }
850 if (reshuffle_ret) {
852
853fail:
854 if (reshuffle_ret)
856 return ret;
857 }
858 }
859
861}
862
864{
865 unsigned char tag[5];
866 unsigned int flags = 0;
867 const int stream_index = pkt->stream_index;
868 int size = pkt->size;
869 AVIContext *avi = s->priv_data;
870 AVIOContext *pb = s->pb;
871 AVIStream *avist = s->streams[stream_index]->priv_data;
872 AVCodecParameters *par = s->streams[stream_index]->codecpar;
873
874 if (pkt->dts != AV_NOPTS_VALUE)
875 avist->last_dts = pkt->dts + pkt->duration;
876
877 avist->packet_count++;
878
879 // Make sure to put an OpenDML chunk when the file size exceeds the limits
880 if ((pb->seekable & AVIO_SEEKABLE_NORMAL) &&
881 (avio_tell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE)) {
883 ff_end_tag(pb, avi->movi_list);
884
885 if (avi->riff_id == 1)
887
888 ff_end_tag(pb, avi->riff_start);
889 avi->movi_list = avi_start_new_riff(s, pb, "AVIX", "movi");
890 }
891
892 avi_stream2fourcc(tag, stream_index, par->codec_type);
893 if (pkt->flags & AV_PKT_FLAG_KEY)
894 flags = 0x10;
895 if (par->codec_type == AVMEDIA_TYPE_AUDIO)
896 avist->audio_strm_length += size;
897
898 if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
899 int ret;
900 ret = avi_add_ientry(s, stream_index, NULL, flags, size);
901 if (ret < 0)
902 return ret;
903 }
904
905 avio_write(pb, tag, 4);
906 avio_wl32(pb, size);
907 avio_write(pb, pkt->data, size);
908 if (size & 1)
909 avio_w8(pb, 0);
910
911 return 0;
912}
913
915{
916 AVIContext *avi = s->priv_data;
917 AVIOContext *pb = s->pb;
918 int res = 0;
919 int i, n, nb_frames;
920 int64_t file_size;
921
922 for (i = 0; i < s->nb_streams; i++) {
923 AVIStream *avist = s->streams[i]->priv_data;
924 write_skip_frames(s, i, avist->last_dts);
925 }
926
927 if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
928 if (avi->riff_id == 1) {
929 ff_end_tag(pb, avi->movi_list);
930 res = avi_write_idx1(s);
931 ff_end_tag(pb, avi->riff_start);
932 } else {
934 ff_end_tag(pb, avi->movi_list);
935 ff_end_tag(pb, avi->riff_start);
936
937 file_size = avio_tell(pb);
938 avio_seek(pb, avi->odml_list - 8, SEEK_SET);
939 ffio_wfourcc(pb, "LIST"); /* Making this AVI OpenDML one */
940 avio_skip(pb, 16);
941
942 for (n = nb_frames = 0; n < s->nb_streams; n++) {
943 AVCodecParameters *par = s->streams[n]->codecpar;
944 AVIStream *avist = s->streams[n]->priv_data;
945
946 if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
947 if (nb_frames < avist->packet_count)
948 nb_frames = avist->packet_count;
949 } else {
950 if (par->codec_id == AV_CODEC_ID_MP2 ||
952 nb_frames += avist->packet_count;
953 }
954 }
955 avio_wl32(pb, nb_frames);
956 avio_seek(pb, file_size, SEEK_SET);
957
959 }
960 }
961
962 if (avi->riff_id >= avi->master_index_max_size) {
963 int index_space = AVI_MASTER_INDEX_PREFIX_SIZE +
965 av_log(s, AV_LOG_WARNING, "Output file not strictly OpenDML compliant, "
966 "consider re-muxing with 'reserve_index_space' option value >= %d\n",
967 index_space);
968 }
969
970 for (i = 0; i < s->nb_streams; i++) {
971 AVIStream *avist = s->streams[i]->priv_data;
972 if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
973 avio_seek(pb, avist->frames_hdr_strm + 4, SEEK_SET);
974 avio_wl32(pb, avist->max_size);
975 }
976 }
977
978 return res;
979}
980
982{
983 for (int i = 0; i < s->nb_streams; i++) {
984 AVIStream *avist = s->streams[i]->priv_data;
985 if (!avist)
986 continue;
987 for (int j = 0; j < avist->indexes.ents_allocated / AVI_INDEX_CLUSTER_SIZE; j++)
988 av_freep(&avist->indexes.cluster[j]);
989 av_freep(&avist->indexes.cluster);
990 avist->indexes.ents_allocated = avist->indexes.entry = 0;
991 }
992}
993
994#define OFFSET(x) offsetof(AVIContext, x)
995#define ENC AV_OPT_FLAG_ENCODING_PARAM
996static const AVOption options[] = {
997 { "reserve_index_space", "reserve space (in bytes) at the beginning of the file for each stream index", OFFSET(reserve_index_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, ENC },
998 { "write_channel_mask", "write channel mask into wave format header", OFFSET(write_channel_mask), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, ENC },
999 { "flipped_raw_rgb", "Raw RGB bitmaps are stored bottom-up", OFFSET(flipped_raw_rgb), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
1000 { NULL },
1001};
1002
1003static const AVClass avi_muxer_class = {
1004 .class_name = "AVI muxer",
1005 .item_name = av_default_item_name,
1006 .option = options,
1007 .version = LIBAVUTIL_VERSION_INT,
1008};
1009
1011 .p.name = "avi",
1012 .p.long_name = NULL_IF_CONFIG_SMALL("AVI (Audio Video Interleaved)"),
1013 .p.mime_type = "video/x-msvideo",
1014 .p.extensions = "avi",
1015 .priv_data_size = sizeof(AVIContext),
1016 .p.audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_AC3,
1017 .p.video_codec = AV_CODEC_ID_MPEG4,
1018 .init = avi_init,
1019 .deinit = avi_deinit,
1020 .write_header = avi_write_header,
1021 .write_packet = avi_write_packet,
1022 .write_trailer = avi_write_trailer,
1023 .p.codec_tag = ff_riff_codec_tags_list,
1024 .p.priv_class = &avi_muxer_class,
1025};
const FFOutputFormat ff_avi_muxer
Definition avienc.c:1010
static AVStream * video_st
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
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:834
Main libavformat public API header.
#define AVIF_HASINDEX
Definition avi.h:24
#define AVISF_VIDEO_PALCHANGES
Definition avi.h:35
#define AVI_MAX_STREAM_COUNT
Definition avi.h:32
#define AVIF_TRUSTCKTYPE
Definition avi.h:27
#define AVIF_ISINTERLEAVED
Definition avi.h:26
#define AVIIF_NO_TIME
Definition avi.h:39
#define AVI_MAX_RIFF_SIZE
Definition avi.h:31
static void avi_deinit(AVFormatContext *s)
Definition avienc.c:981
static char * avi_stream2fourcc(char *tag, int index, enum AVMediaType type)
Definition avienc.c:184
static int avi_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
Definition avienc.c:863
static int64_t avi_start_new_riff(AVFormatContext *s, AVIOContext *pb, const char *riff_tag, const char *list_tag)
Definition avienc.c:163
#define AVI_INDEX_CLUSTER_SIZE
Definition avienc.c:57
static av_cold int avi_init(struct AVFormatContext *s)
Definition avienc.c:148
static int avi_write_counters(AVFormatContext *s, int riff_id)
Definition avienc.c:203
static int write_skip_frames(AVFormatContext *s, int stream_index, int64_t dts)
Definition avienc.c:745
static void update_odml_entry(AVFormatContext *s, int stream_index, int64_t ix, int size)
Definition avienc.c:600
static int avi_write_ix(AVFormatContext *s)
Definition avienc.c:632
static const AVClass avi_muxer_class
Definition avienc.c:1003
static int avi_write_trailer(AVFormatContext *s)
Definition avienc.c:914
#define AVI_MASTER_INDEX_SIZE_DEFAULT
Definition avienc.c:60
static AVIIentry * avi_get_ientry(const AVIIndex *idx, int ent_id)
Definition avienc.c:104
static int avi_add_ientry(AVFormatContext *s, int stream_index, char *tag, unsigned int flags, unsigned int size)
Definition avienc.c:111
#define AVI_MASTER_INDEX_ENTRY_SIZE
Definition avienc.c:59
static int avi_write_idx1(AVFormatContext *s)
Definition avienc.c:690
static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition avienc.c:768
#define OFFSET(x)
Definition avienc.c:994
static int avi_write_header(AVFormatContext *s)
Definition avienc.c:261
#define AVI_MASTER_INDEX_PREFIX_SIZE
Definition avienc.c:58
static void write_odml_master(AVFormatContext *s, int stream_index)
Definition avienc.c:236
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition aviobuf.c:236
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition avio.h:41
void avio_wl64(AVIOContext *s, uint64_t val)
Definition aviobuf.c:428
void avio_wl32(AVIOContext *s, unsigned int val)
Definition aviobuf.c:360
void avio_wl16(AVIOContext *s, unsigned int val)
Definition aviobuf.c:440
void avio_w8(AVIOContext *s, int b)
Definition aviobuf.c:184
void avio_wb32(AVIOContext *s, unsigned int val)
Definition aviobuf.c:368
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition avio.h:494
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition aviobuf.c:321
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition aviobuf.c:206
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition aviobuf.c:192
const char * ff_convert_lang_to(const char *lang, enum AVLangCodespace target_codespace)
Convert a language code to a target codespace.
Definition avlanguage.c:741
@ AV_LANG_ISO639_1
3-char terminological language codes as per ISO-IEC 639-2
Definition avlanguage.h:30
char * av_asprintf(const char *fmt,...)
Definition avstring.c:115
Convenience header that includes libavutil's core.
#define ENC
Definition caca.c:198
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static __device__ float ceil(float a)
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition defs.h:214
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition defs.h:215
@ AV_FIELD_BT
Bottom coded first, top displayed first.
Definition defs.h:217
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition defs.h:216
static AVPacket * pkt
static enum AVPixelFormat pix_fmt
Public dictionary API.
enum AVCodecID id
Definition dts2pts.c:607
#define fail
Definition test.h:479
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ AV_CODEC_ID_RAWVIDEO
Definition codec_id.h:63
@ AV_CODEC_ID_XSUB
Definition codec_id.h:569
@ AV_CODEC_ID_H264
Definition codec_id.h:77
@ AV_CODEC_ID_MP2
Definition codec_id.h:453
@ AV_CODEC_ID_AC3
Definition codec_id.h:456
@ AV_CODEC_ID_MPEG4
Definition codec_id.h:62
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition codec_id.h:454
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:650
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
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition rational.c:80
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition utils.c:28
AVMediaType
Definition avutil.h:198
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition avutil.h:311
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_SUBTITLE
Definition avutil.h:203
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition avutil.h:202
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
#define AV_TIME_BASE
Internal time base represented as integer.
Definition avutil.h:253
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition avutil.h:263
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
#define AV_STRINGIFY(s)
Definition macros.h:66
int index
Definition gxfenc.c:90
cl_device_type type
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition internal.h:130
Macro definitions for various function/variable attributes.
#define av_fallthrough
Definition attributes.h:67
#define av_cold
Definition attributes.h:117
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define FFMIN(a, b)
Definition macros.h:49
#define MKTAG(a, b, c, d)
Definition macros.h:55
#define FFMAX(a, b)
Definition macros.h:47
#define FFALIGN(x, a)
Definition macros.h:78
Memory handling functions.
uint32_t tag
Definition movenc.c:2073
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
Check presence of H264 startcode.
Definition mpegtsenc.c:1839
#define av_malloc(s)
Definition ops_static.c:52
AVOptions.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition pixdesc.c:3380
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:115
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition pixfmt.h:84
#define AVPALETTE_COUNT
Definition pixfmt.h:33
enum AVPixelFormat avpriv_pix_fmt_find(enum PixelFormatTagLists list, unsigned fourcc)
Definition raw.c:78
Raw Video Codec.
@ PIX_FMT_LIST_AVI
Definition raw.h:39
int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
Retrieves the palette from a packet, either from side data, or appended to the video data in the pack...
Definition rawutils.c:77
int ff_reshuffle_raw_rgb(AVFormatContext *s, AVPacket **ppkt, AVCodecParameters *par, int expected_stride)
Reshuffles the lines to use the user specified stride.
Definition rawutils.c:27
internal header for RIFF based (de)muxers do NOT include this in end user applications
void ff_end_tag(AVIOContext *pb, int64_t start)
Definition riffenc.c:38
void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
Write a single RIFF info tag.
Definition riffenc.c:325
void ff_riff_write_info(AVFormatContext *s)
Write all recognized RIFF tags from s->metadata.
Definition riffenc.c:357
void ff_put_bmp_header(AVIOContext *pb, AVCodecParameters *par, int for_asf, int ignore_extradata, int rgb_frame_is_flipped)
Definition riffenc.c:236
int64_t ff_start_tag(AVIOContext *pb, const char *tag)
Definition riffenc.c:31
void ff_parse_specific_params(AVStream *st, int *au_rate, int *au_ssize, int *au_scale)
Definition riffenc.c:295
int ff_put_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int flags)
Write WAVEFORMAT header structure.
Definition riffenc.c:54
#define FF_PUT_WAV_HEADER_SKIP_CHANNELMASK
Tell ff_put_wav_header() to write an empty channel mask.
Definition riff.h:58
const AVCodecTag *const ff_riff_codec_tags_list[]
unsigned int pos
Definition spdifenc.c:431
Describe the class of an AVClass context structure.
Definition log.h:76
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
enum AVFieldOrder field_order
The order of the fields in interlaced video.
Definition codec_par.h:182
int height
The height of the video frame in pixels.
Definition codec_par.h:150
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition codec_par.h:113
int width
The width of the video frame in pixels.
Definition codec_par.h:143
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition codec_par.h:99
enum AVMediaType codec_type
General type of the encoded data.
Definition codec_par.h:53
int block_align
The number of bytes per coded audio frame, required by some formats.
Definition codec_par.h:221
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition codec_par.h:61
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
char * value
Definition dict.h:92
Format I/O context.
Definition avformat.h:1333
AVPacket * empty_packet
Definition avienc.c:73
int write_channel_mask
Definition avienc.c:79
int flipped_raw_rgb
Definition avienc.c:80
int64_t movi_list
Definition avidec.c:80
int64_t frames_hdr_all
Definition avienc.c:75
int64_t odml_list
Definition avienc.c:74
int riff_id
Definition avienc.c:76
int64_t riff_start
Definition avienc.c:74
int master_index_max_size
Definition avienc.c:78
int reserve_index_space
Definition avienc.c:77
unsigned int flags
Definition avienc.c:52
unsigned int len
Definition avienc.c:54
unsigned int pos
Definition avienc.c:53
char tag[4]
Definition avienc.c:51
int ents_allocated
Definition avienc.c:66
int master_odml_riff_id_base
Definition avienc.c:67
int64_t indx_start
Definition avienc.c:63
int64_t audio_strm_offset
Definition avienc.c:64
AVIIentry ** cluster
Definition avienc.c:68
int entry
Definition avienc.c:65
Bytestream IO Context.
Definition avio.h:160
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition avio.h:261
int entry
Definition avienc.c:87
int64_t last_dts
Definition avienc.c:91
AVIIndex indexes
Definition avienc.c:93
int64_t frames_hdr_strm
Definition avienc.c:84
int64_t audio_strm_length
Definition avienc.c:85
int packet_count
Definition avienc.c:86
int64_t strh_flags_offset
Definition avienc.c:95
uint32_t old_palette[AVPALETTE_COUNT]
Definition avienc.c:98
int sample_requested
Definition avienc.c:89
uint32_t palette[AVPALETTE_COUNT]
Definition avienc.c:97
int max_size
Definition avienc.c:88
int64_t pal_offset
Definition avienc.c:99
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int stream_index
Definition packet.h:605
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition avformat.h:844
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition avformat.h:825
AVDictionary * metadata
Definition avformat.h:846
void * priv_data
Definition avformat.h:791
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avformat.h:805
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
Definition internal.h:111
#define av_free(p)
#define av_mallocz(s)
#define ff_dlog(a,...)
#define av_realloc_f(p, o, n)
#define avpriv_request_sample(...)
#define av_freep(p)
#define av_log(a,...)
int64_t bitrate
Definition av1_levels.c:47
timestamp utils, mostly useful for debugging/logging purposes
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition timestamp.h:54
int size