Mercurial > libavformat.hg
annotate dvenc.c @ 1779:de2cf54eb68f libavformat
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
author | bcoudurier |
---|---|
date | Sun, 11 Feb 2007 12:50:33 +0000 |
parents | 184229324f14 |
children | 2f0154760e5f |
rev | line source |
---|---|
885 | 1 /* |
2 * General DV muxer/demuxer | |
933 | 3 * Copyright (c) 2003 Roman Shaposhnik |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
4 * |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
5 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
6 * of DV technical info. |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
7 * |
0 | 8 * Raw DV format |
9 * Copyright (c) 2002 Fabrice Bellard. | |
10 * | |
995 | 11 * 50 Mbps (DVCPRO50) support |
12 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com> | |
13 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1322
diff
changeset
|
14 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1322
diff
changeset
|
15 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1322
diff
changeset
|
16 * FFmpeg is free software; you can redistribute it and/or |
0 | 17 * modify it under the terms of the GNU Lesser General Public |
18 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1322
diff
changeset
|
19 * version 2.1 of the License, or (at your option) any later version. |
0 | 20 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1322
diff
changeset
|
21 * FFmpeg is distributed in the hope that it will be useful, |
0 | 22 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
24 * Lesser General Public License for more details. | |
25 * | |
26 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1322
diff
changeset
|
27 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
28 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 29 */ |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
30 #include <time.h> |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
31 #include <stdarg.h> |
0 | 32 #include "avformat.h" |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
33 #include "dvdata.h" |
296
252946de6d3f
* DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents:
288
diff
changeset
|
34 #include "dv.h" |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
35 #include "fifo.h" |
0 | 36 |
296
252946de6d3f
* DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents:
288
diff
changeset
|
37 struct DVMuxContext { |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
38 const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */ |
995 | 39 int n_ast; /* Number of stereo audio streams (up to 2) */ |
40 AVStream *ast[2]; /* Stereo audio streams */ | |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
41 AVFifoBuffer audio_data[2]; /* Fifo for storing excessive amounts of PCM */ |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
42 int frames; /* Number of a current frame */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
43 time_t start_time; /* Start time of recording */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
44 int has_audio; /* frame under contruction has audio */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
45 int has_video; /* frame under contruction has video */ |
995 | 46 uint8_t frame_buf[DV_MAX_FRAME_SIZE]; /* frame under contruction */ |
296
252946de6d3f
* DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents:
288
diff
changeset
|
47 }; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
48 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
49 static const int dv_aaux_packs_dist[12][9] = { |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
50 { 0xff, 0xff, 0xff, 0x50, 0x51, 0x52, 0x53, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
51 { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
52 { 0xff, 0xff, 0xff, 0x50, 0x51, 0x52, 0x53, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
53 { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
54 { 0xff, 0xff, 0xff, 0x50, 0x51, 0x52, 0x53, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
55 { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
56 { 0xff, 0xff, 0xff, 0x50, 0x51, 0x52, 0x53, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
57 { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
58 { 0xff, 0xff, 0xff, 0x50, 0x51, 0x52, 0x53, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
59 { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
60 { 0xff, 0xff, 0xff, 0x50, 0x51, 0x52, 0x53, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
61 { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
62 }; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
63 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
64 static int dv_audio_frame_size(const DVprofile* sys, int frame) |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
65 { |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
66 return sys->audio_samples_dist[frame % (sizeof(sys->audio_samples_dist)/ |
887 | 67 sizeof(sys->audio_samples_dist[0]))]; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
68 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
69 |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
70 static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* buf, ...) |
0 | 71 { |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
72 struct tm tc; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
73 time_t ct; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
74 int ltc_frame; |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
75 va_list ap; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
76 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
77 buf[0] = (uint8_t)pack_id; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
78 switch (pack_id) { |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
79 case dv_timecode: |
885 | 80 ct = (time_t)(c->frames / ((float)c->sys->frame_rate / |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
81 (float)c->sys->frame_rate_base)); |
515
ad72189eec07
* replacing calls to not-always-available gmtime_r with our own code.
romansh
parents:
508
diff
changeset
|
82 brktimegm(ct, &tc); |
885 | 83 /* |
84 * LTC drop-frame frame counter drops two frames (0 and 1) every | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
85 * minute, unless it is exactly divisible by 10 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
86 */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
87 ltc_frame = (c->frames + 2*ct/60 - 2*ct/600) % c->sys->ltc_divisor; |
887 | 88 buf[1] = (0 << 7) | /* Color fame: 0 - unsync; 1 - sync mode */ |
89 (1 << 6) | /* Drop frame timecode: 0 - nondrop; 1 - drop */ | |
90 ((ltc_frame / 10) << 4) | /* Tens of frames */ | |
91 (ltc_frame % 10); /* Units of frames */ | |
92 buf[2] = (1 << 7) | /* Biphase mark polarity correction: 0 - even; 1 - odd */ | |
93 ((tc.tm_sec / 10) << 4) | /* Tens of seconds */ | |
94 (tc.tm_sec % 10); /* Units of seconds */ | |
95 buf[3] = (1 << 7) | /* Binary group flag BGF0 */ | |
96 ((tc.tm_min / 10) << 4) | /* Tens of minutes */ | |
97 (tc.tm_min % 10); /* Units of minutes */ | |
98 buf[4] = (1 << 7) | /* Binary group flag BGF2 */ | |
99 (1 << 6) | /* Binary group flag BGF1 */ | |
100 ((tc.tm_hour / 10) << 4) | /* Tens of hours */ | |
101 (tc.tm_hour % 10); /* Units of hours */ | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
102 break; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
103 case dv_audio_source: /* AAUX source pack */ |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
104 va_start(ap, buf); |
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
105 buf[1] = (1 << 7) | /* locked mode -- SMPTE only supports locked mode */ |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
106 (1 << 6) | /* reserved -- always 1 */ |
887 | 107 (dv_audio_frame_size(c->sys, c->frames) - |
108 c->sys->audio_min_samples[0]); | |
109 /* # of samples */ | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
110 buf[2] = (0 << 7) | /* multi-stereo */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
111 (0 << 5) | /* #of audio channels per block: 0 -- 1 channel */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
112 (0 << 4) | /* pair bit: 0 -- one pair of channels */ |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
113 !!va_arg(ap, int); /* audio mode */ |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
114 buf[3] = (1 << 7) | /* res */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
115 (1 << 6) | /* multi-language flag */ |
887 | 116 (c->sys->dsf << 5) | /* system: 60fields/50fields */ |
1394 | 117 (c->sys->n_difchan & 2); /* definition: 0 -- 25Mbps, 2 -- 50Mbps */ |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
118 buf[4] = (1 << 7) | /* emphasis: 1 -- off */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
119 (0 << 6) | /* emphasis time constant: 0 -- reserved */ |
887 | 120 (0 << 3) | /* frequency: 0 -- 48Khz, 1 -- 44,1Khz, 2 -- 32Khz */ |
885 | 121 0; /* quantization: 0 -- 16bit linear, 1 -- 12bit nonlinear */ |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
122 va_end(ap); |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
123 break; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
124 case dv_audio_control: |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
125 buf[1] = (0 << 6) | /* copy protection: 0 -- unrestricted */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
126 (1 << 4) | /* input source: 1 -- digital input */ |
887 | 127 (3 << 2) | /* compression: 3 -- no information */ |
128 0; /* misc. info/SMPTE emphasis off */ | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
129 buf[2] = (1 << 7) | /* recording start point: 1 -- no */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
130 (1 << 6) | /* recording end point: 1 -- no */ |
887 | 131 (1 << 3) | /* recording mode: 1 -- original */ |
132 7; | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
133 buf[3] = (1 << 7) | /* direction: 1 -- forward */ |
1394 | 134 (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0x20 : /* speed */ |
135 c->sys->ltc_divisor*4); | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
136 buf[4] = (1 << 7) | /* reserved -- always 1 */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
137 0x7f; /* genre category */ |
887 | 138 break; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
139 case dv_audio_recdate: |
848 | 140 case dv_video_recdate: /* VAUX recording date */ |
885 | 141 ct = c->start_time + (time_t)(c->frames / |
887 | 142 ((float)c->sys->frame_rate / (float)c->sys->frame_rate_base)); |
515
ad72189eec07
* replacing calls to not-always-available gmtime_r with our own code.
romansh
parents:
508
diff
changeset
|
143 brktimegm(ct, &tc); |
887 | 144 buf[1] = 0xff; /* ds, tm, tens of time zone, units of time zone */ |
145 /* 0xff is very likely to be "unknown" */ | |
146 buf[2] = (3 << 6) | /* reserved -- always 1 */ | |
147 ((tc.tm_mday / 10) << 4) | /* Tens of day */ | |
148 (tc.tm_mday % 10); /* Units of day */ | |
149 buf[3] = /* we set high 4 bits to 0, shouldn't we set them to week? */ | |
150 ((tc.tm_mon / 10) << 4) | /* Tens of month */ | |
151 (tc.tm_mon % 10); /* Units of month */ | |
152 buf[4] = (((tc.tm_year % 100) / 10) << 4) | /* Tens of year */ | |
153 (tc.tm_year % 10); /* Units of year */ | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
154 break; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
155 case dv_audio_rectime: /* AAUX recording time */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
156 case dv_video_rectime: /* VAUX recording time */ |
885 | 157 ct = c->start_time + (time_t)(c->frames / |
887 | 158 ((float)c->sys->frame_rate / (float)c->sys->frame_rate_base)); |
159 brktimegm(ct, &tc); | |
160 buf[1] = (3 << 6) | /* reserved -- always 1 */ | |
161 0x3f; /* tens of frame, units of frame: 0x3f - "unknown" ? */ | |
162 buf[2] = (1 << 7) | /* reserved -- always 1 */ | |
163 ((tc.tm_sec / 10) << 4) | /* Tens of seconds */ | |
164 (tc.tm_sec % 10); /* Units of seconds */ | |
165 buf[3] = (1 << 7) | /* reserved -- always 1 */ | |
166 ((tc.tm_min / 10) << 4) | /* Tens of minutes */ | |
167 (tc.tm_min % 10); /* Units of minutes */ | |
168 buf[4] = (3 << 6) | /* reserved -- always 1 */ | |
169 ((tc.tm_hour / 10) << 4) | /* Tens of hours */ | |
170 (tc.tm_hour % 10); /* Units of hours */ | |
171 break; | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
172 default: |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
173 buf[1] = buf[2] = buf[3] = buf[4] = 0xff; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
174 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
175 return 5; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
176 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
177 |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
178 static void dv_inject_audio(DVMuxContext *c, int channel, uint8_t* frame_ptr) |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
179 { |
504 | 180 int i, j, d, of, size; |
181 size = 4 * dv_audio_frame_size(c->sys, c->frames); | |
995 | 182 frame_ptr += channel * c->sys->difseg_size * 150 * 80; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
183 for (i = 0; i < c->sys->difseg_size; i++) { |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
184 frame_ptr += 6 * 80; /* skip DIF segment header */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
185 for (j = 0; j < 9; j++) { |
1656
184229324f14
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
1466
diff
changeset
|
186 dv_write_pack(dv_aaux_packs_dist[i][j], c, &frame_ptr[3], i >= c->sys->difseg_size/2); |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
187 for (d = 8; d < 80; d+=2) { |
887 | 188 of = c->sys->audio_shuffle[i][j] + (d - 8)/2 * c->sys->audio_stride; |
189 if (of*2 >= size) | |
190 continue; | |
885 | 191 |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
192 frame_ptr[d] = av_fifo_peek(&c->audio_data[channel], of*2+1); // FIXME: may be we have to admit |
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
193 frame_ptr[d+1] = av_fifo_peek(&c->audio_data[channel], of*2); // that DV is a big endian PCM |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
194 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
195 frame_ptr += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
196 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
197 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
198 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
199 |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
200 static void dv_inject_metadata(DVMuxContext *c, uint8_t* frame) |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
201 { |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
202 int j, k; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
203 uint8_t* buf; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
204 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
205 for (buf = frame; buf < frame + c->sys->frame_size; buf += 150 * 80) { |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
206 /* DV subcode: 2nd and 3d DIFs */ |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
207 for (j = 80; j < 80 * 3; j += 80) { |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
208 for (k = 6; k < 6 * 8; k += 8) |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
209 dv_write_pack(dv_timecode, c, &buf[j+k]); |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
210 |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
211 if (((long)(buf-frame)/(c->sys->frame_size/(c->sys->difseg_size*c->sys->n_difchan))%c->sys->difseg_size) > 5) { /* FIXME: is this really needed ? */ |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
212 dv_write_pack(dv_video_recdate, c, &buf[j+14]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
213 dv_write_pack(dv_video_rectime, c, &buf[j+22]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
214 dv_write_pack(dv_video_recdate, c, &buf[j+38]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
215 dv_write_pack(dv_video_rectime, c, &buf[j+46]); |
995 | 216 } |
217 } | |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
218 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
219 /* DV VAUX: 4th, 5th and 6th 3DIFs */ |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
220 for (j = 80*3 + 3; j < 80*6; j += 80) { |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
221 dv_write_pack(dv_video_recdate, c, &buf[j+5*2]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
222 dv_write_pack(dv_video_rectime, c, &buf[j+5*3]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
223 dv_write_pack(dv_video_recdate, c, &buf[j+5*11]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
224 dv_write_pack(dv_video_rectime, c, &buf[j+5*12]); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
225 } |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
226 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
227 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
228 |
885 | 229 /* |
1317
132206560fe6
Split the DV demuxer and muxer into separate files (as suggested by Diego
takis
parents:
1289
diff
changeset
|
230 * The following 3 functions constitute our interface to the world |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
231 */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
232 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
233 int dv_assemble_frame(DVMuxContext *c, AVStream* st, |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
234 const uint8_t* data, int data_size, uint8_t** frame) |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
235 { |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
236 int i, reqasize; |
885 | 237 |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
238 *frame = &c->frame_buf[0]; |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
239 reqasize = 4 * dv_audio_frame_size(c->sys, c->frames); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
240 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
241 switch (st->codec->codec_type) { |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
242 case CODEC_TYPE_VIDEO: |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
243 /* FIXME: we have to have more sensible approach than this one */ |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
244 if (c->has_video) |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
245 av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient audio data or severe sync problem.\n", c->frames); |
885 | 246 |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
247 memcpy(*frame, data, c->sys->frame_size); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
248 c->has_video = 1; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
249 break; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
250 case CODEC_TYPE_AUDIO: |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
251 for (i = 0; i < c->n_ast && st != c->ast[i]; i++); |
885 | 252 |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
253 /* FIXME: we have to have more sensible approach than this one */ |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
254 if (av_fifo_size(&c->audio_data[i]) + data_size >= 100*AVCODEC_MAX_AUDIO_FRAME_SIZE) |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
255 av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames); |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
256 av_fifo_write(&c->audio_data[i], data, data_size); |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
257 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
258 /* Lets see if we've got enough audio for one DV frame */ |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
259 c->has_audio |= ((reqasize <= av_fifo_size(&c->audio_data[i])) << i); |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
260 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
261 break; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
262 default: |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
263 break; |
885 | 264 } |
265 | |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
266 /* Lets see if we have enough data to construct one DV frame */ |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
267 if (c->has_video == 1 && c->has_audio + 1 == 1<<c->n_ast) { |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
268 dv_inject_metadata(c, *frame); |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
269 for (i=0; i<c->n_ast; i++) { |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
270 dv_inject_audio(c, i, *frame); |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
271 av_fifo_drain(&c->audio_data[i], reqasize); |
887 | 272 } |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
273 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
274 c->has_video = 0; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
275 c->has_audio = 0; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
276 c->frames++; |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
277 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
278 return c->sys->frame_size; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
279 } |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
280 |
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
281 return 0; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
282 } |
0 | 283 |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
284 DVMuxContext* dv_init_mux(AVFormatContext* s) |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
285 { |
1466 | 286 DVMuxContext *c = (DVMuxContext *)s->priv_data; |
531
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
287 AVStream *vst = NULL; |
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
288 int i; |
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
289 |
995 | 290 /* we support at most 1 video and 2 audio streams */ |
291 if (s->nb_streams > 3) | |
531
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
292 return NULL; |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
293 |
995 | 294 c->n_ast = 0; |
295 c->ast[0] = c->ast[1] = NULL; | |
296 | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
297 /* We have to sort out where audio and where video stream is */ |
531
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
298 for (i=0; i<s->nb_streams; i++) { |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
299 switch (s->streams[i]->codec->codec_type) { |
887 | 300 case CODEC_TYPE_VIDEO: |
301 vst = s->streams[i]; | |
302 break; | |
303 case CODEC_TYPE_AUDIO: | |
995 | 304 c->ast[c->n_ast++] = s->streams[i]; |
305 break; | |
887 | 306 default: |
307 goto bail_out; | |
308 } | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
309 } |
885 | 310 |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
311 /* Some checks -- DV format is very picky about its incoming streams */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
312 if (!vst || vst->codec->codec_id != CODEC_ID_DVVIDEO) |
531
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
313 goto bail_out; |
995 | 314 for (i=0; i<c->n_ast; i++) { |
315 if (c->ast[i] && (c->ast[i]->codec->codec_id != CODEC_ID_PCM_S16LE || | |
316 c->ast[i]->codec->sample_rate != 48000 || | |
317 c->ast[i]->codec->channels != 2)) | |
318 goto bail_out; | |
319 } | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
320 c->sys = dv_codec_profile(vst->codec); |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
321 if (!c->sys) |
887 | 322 goto bail_out; |
885 | 323 |
995 | 324 if((c->n_ast > 1) && (c->sys->n_difchan < 2)) { |
325 /* only 1 stereo pair is allowed in 25Mbps mode */ | |
326 goto bail_out; | |
327 } | |
328 | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
329 /* Ok, everything seems to be in working order */ |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
330 c->frames = 0; |
1289
6db39fb15d60
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
1169
diff
changeset
|
331 c->has_audio = 0; |
531
2af447b91329
* let DV muxer generate audioless DV streams. This might not be 100%
romansh
parents:
528
diff
changeset
|
332 c->has_video = 0; |
420
e440fb884442
* making it possible to specify recording date and time in a stream
romansh
parents:
417
diff
changeset
|
333 c->start_time = (time_t)s->timestamp; |
37 | 334 |
995 | 335 for (i=0; i<c->n_ast; i++) { |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
336 if (c->ast[i] && av_fifo_init(&c->audio_data[i], 100*AVCODEC_MAX_AUDIO_FRAME_SIZE) < 0) { |
995 | 337 while (i>0) { |
338 i--; | |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
339 av_fifo_free(&c->audio_data[i]); |
995 | 340 } |
341 goto bail_out; | |
342 } | |
343 } | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
344 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
345 return c; |
885 | 346 |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
347 bail_out: |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
348 return NULL; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
349 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
350 |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
351 void dv_delete_mux(DVMuxContext *c) |
885 | 352 { |
995 | 353 int i; |
354 for (i=0; i < c->n_ast; i++) | |
1322
95f56c7b24eb
* Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
1317
diff
changeset
|
355 av_fifo_free(&c->audio_data[i]); |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
356 } |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
357 |
903
68bc3ca12e79
Put muxer-specific code parts in #ifdef CONFIG_MUXERS.
diego
parents:
896
diff
changeset
|
358 #ifdef CONFIG_MUXERS |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
359 static int dv_write_header(AVFormatContext *s) |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
360 { |
1466 | 361 if (!dv_init_mux(s)) { |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
363
diff
changeset
|
362 av_log(s, AV_LOG_ERROR, "Can't initialize DV format!\n" |
887 | 363 "Make sure that you supply exactly two streams:\n" |
995 | 364 " video: 25fps or 29.97fps, audio: 2ch/48Khz/PCM\n" |
365 " (50Mbps allows an optional second audio stream)\n"); | |
887 | 366 return -1; |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
367 } |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
368 return 0; |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
369 } |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
370 |
468 | 371 static int dv_write_packet(struct AVFormatContext *s, AVPacket *pkt) |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
372 { |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
373 uint8_t* frame; |
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
374 int fsize; |
885 | 375 |
468 | 376 fsize = dv_assemble_frame((DVMuxContext *)s->priv_data, s->streams[pkt->stream_index], |
377 pkt->data, pkt->size, &frame); | |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
378 if (fsize > 0) { |
885 | 379 put_buffer(&s->pb, frame, fsize); |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
380 put_flush_packet(&s->pb); |
885 | 381 } |
363
efd9dfe4f504
* turns out write_packet is supposed to return 0 on success, not
romansh
parents:
296
diff
changeset
|
382 return 0; |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
383 } |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
384 |
885 | 385 /* |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
386 * We might end up with some extra A/V data without matching counterpart. |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
387 * E.g. video data without enough audio to write the complete frame. |
885 | 388 * Currently we simply drop the last frame. I don't know whether this |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
389 * is the best strategy of all |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
390 */ |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
391 static int dv_write_trailer(struct AVFormatContext *s) |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
392 { |
262
f174d9c00bce
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
241
diff
changeset
|
393 dv_delete_mux((DVMuxContext *)s->priv_data); |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
394 return 0; |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
395 } |
903
68bc3ca12e79
Put muxer-specific code parts in #ifdef CONFIG_MUXERS.
diego
parents:
896
diff
changeset
|
396 #endif /* CONFIG_MUXERS */ |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
397 |
1169 | 398 #ifdef CONFIG_DV_MUXER |
399 AVOutputFormat dv_muxer = { | |
0 | 400 "dv", |
401 "DV video format", | |
402 NULL, | |
403 "dv", | |
203
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
404 sizeof(DVMuxContext), |
184d22d04c84
* Phase 1 for DV encoding support. Muxing/demuxing of DV streams is now
romansh
parents:
119
diff
changeset
|
405 CODEC_ID_PCM_S16LE, |
0 | 406 CODEC_ID_DVVIDEO, |
407 dv_write_header, | |
408 dv_write_packet, | |
409 dv_write_trailer, | |
410 }; | |
903
68bc3ca12e79
Put muxer-specific code parts in #ifdef CONFIG_MUXERS.
diego
parents:
896
diff
changeset
|
411 #endif |