Mercurial > libavformat.hg
annotate movenchint.c @ 6133:4040ce73a1ed libavformat
Add compatibility wrappers for functions moved from lavf to lavc
When symbol versioning is enabled, moving symbols from one library to
another breaks binary compatibility. This adds wrappers with the old
version tag for the av_*packet functions recently moved to lavc.
author | mru |
---|---|
date | Tue, 15 Jun 2010 13:26:52 +0000 |
parents | fd7fc7d79630 |
children |
rev | line source |
---|---|
6013 | 1 /* |
2 * MOV, 3GP, MP4 muxer RTP hinting | |
3 * Copyright (c) 2010 Martin Storsjo | |
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 "movenc.h" | |
23 #include "libavutil/intreadwrite.h" | |
6025
fd7fc7d79630
Take ff_write_chained in use in the mov rtp hinter and in the rtsp muxer
mstorsjo
parents:
6014
diff
changeset
|
24 #include "internal.h" |
6013 | 25 |
26 int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index) | |
27 { | |
28 MOVMuxContext *mov = s->priv_data; | |
29 MOVTrack *track = &mov->tracks[index]; | |
30 MOVTrack *src_track = &mov->tracks[src_index]; | |
31 AVStream *src_st = s->streams[src_index]; | |
32 int ret = AVERROR(ENOMEM); | |
33 AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL); | |
34 | |
35 track->tag = MKTAG('r','t','p',' '); | |
36 track->src_track = src_index; | |
37 | |
38 if (!rtp_format) { | |
39 ret = AVERROR(ENOENT); | |
40 goto fail; | |
41 } | |
42 | |
43 track->enc = avcodec_alloc_context(); | |
44 if (!track->enc) | |
45 goto fail; | |
46 track->enc->codec_type = AVMEDIA_TYPE_DATA; | |
47 track->enc->codec_tag = track->tag; | |
48 | |
49 track->rtp_ctx = avformat_alloc_context(); | |
50 if (!track->rtp_ctx) | |
51 goto fail; | |
52 track->rtp_ctx->oformat = rtp_format; | |
53 if (!av_new_stream(track->rtp_ctx, 0)) | |
54 goto fail; | |
55 | |
56 /* Copy stream parameters */ | |
57 track->rtp_ctx->streams[0]->sample_aspect_ratio = | |
58 src_st->sample_aspect_ratio; | |
59 | |
60 /* Remove the allocated codec context, link to the original one | |
61 * instead, to give the rtp muxer access to codec parameters. */ | |
62 av_free(track->rtp_ctx->streams[0]->codec); | |
63 track->rtp_ctx->streams[0]->codec = src_st->codec; | |
64 | |
65 if ((ret = url_open_dyn_packet_buf(&track->rtp_ctx->pb, | |
66 RTP_MAX_PACKET_SIZE)) < 0) | |
67 goto fail; | |
68 ret = av_write_header(track->rtp_ctx); | |
69 if (ret) | |
70 goto fail; | |
71 | |
72 /* Copy the RTP AVStream timebase back to the hint AVStream */ | |
73 track->timescale = track->rtp_ctx->streams[0]->time_base.den; | |
74 | |
75 /* Mark the hinted track that packets written to it should be | |
76 * sent to this track for hinting. */ | |
77 src_track->hint_track = index; | |
78 return 0; | |
79 fail: | |
80 av_log(s, AV_LOG_WARNING, | |
81 "Unable to initialize hinting of stream %d\n", src_index); | |
82 if (track->rtp_ctx && track->rtp_ctx->pb) { | |
83 uint8_t *buf; | |
84 url_close_dyn_buf(track->rtp_ctx->pb, &buf); | |
85 av_free(buf); | |
86 } | |
87 if (track->rtp_ctx && track->rtp_ctx->streams[0]) { | |
88 av_metadata_free(&track->rtp_ctx->streams[0]->metadata); | |
89 av_free(track->rtp_ctx->streams[0]); | |
90 } | |
91 if (track->rtp_ctx) { | |
92 av_metadata_free(&track->rtp_ctx->metadata); | |
93 av_free(track->rtp_ctx->priv_data); | |
94 av_freep(&track->rtp_ctx); | |
95 } | |
96 av_freep(&track->enc); | |
97 /* Set a default timescale, to avoid crashes in dump_format */ | |
98 track->timescale = 90000; | |
99 return ret; | |
100 } | |
101 | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
102 /** |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
103 * Remove the first sample from the sample queue. |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
104 */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
105 static void sample_queue_pop(HintSampleQueue *queue) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
106 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
107 if (queue->len <= 0) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
108 return; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
109 if (queue->samples[0].own_data) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
110 av_free(queue->samples[0].data); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
111 queue->len--; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
112 memmove(queue->samples, queue->samples + 1, sizeof(HintSample)*queue->len); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
113 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
114 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
115 /** |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
116 * Empty the sample queue, releasing all memory. |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
117 */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
118 static void sample_queue_free(HintSampleQueue *queue) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
119 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
120 int i; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
121 for (i = 0; i < queue->len; i++) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
122 if (queue->samples[i].own_data) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
123 av_free(queue->samples[i].data); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
124 av_freep(&queue->samples); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
125 queue->len = 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
126 queue->size = 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
127 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
128 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
129 /** |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
130 * Add a reference to the sample data to the sample queue. The data is |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
131 * not copied. sample_queue_retain should be called before pkt->data |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
132 * is reused/freed. |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
133 */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
134 static void sample_queue_push(HintSampleQueue *queue, AVPacket *pkt, int sample) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
135 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
136 /* No need to keep track of smaller samples, since describing them |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
137 * with immediates is more efficient. */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
138 if (pkt->size <= 14) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
139 return; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
140 if (!queue->samples || queue->len >= queue->size) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
141 HintSample* samples; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
142 queue->size += 10; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
143 samples = av_realloc(queue->samples, sizeof(HintSample)*queue->size); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
144 if (!samples) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
145 return; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
146 queue->samples = samples; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
147 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
148 queue->samples[queue->len].data = pkt->data; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
149 queue->samples[queue->len].size = pkt->size; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
150 queue->samples[queue->len].sample_number = sample; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
151 queue->samples[queue->len].offset = 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
152 queue->samples[queue->len].own_data = 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
153 queue->len++; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
154 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
155 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
156 /** |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
157 * Make local copies of all referenced sample data in the queue. |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
158 */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
159 static void sample_queue_retain(HintSampleQueue *queue) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
160 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
161 int i; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
162 for (i = 0; i < queue->len; ) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
163 HintSample *sample = &queue->samples[i]; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
164 if (!sample->own_data) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
165 uint8_t* ptr = av_malloc(sample->size); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
166 if (!ptr) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
167 /* Unable to allocate memory for this one, remove it */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
168 memmove(queue->samples + i, queue->samples + i + 1, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
169 sizeof(HintSample)*(queue->len - i - 1)); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
170 queue->len--; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
171 continue; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
172 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
173 memcpy(ptr, sample->data, sample->size); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
174 sample->data = ptr; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
175 sample->own_data = 1; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
176 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
177 i++; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
178 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
179 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
180 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
181 /** |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
182 * Find matches of needle[n_pos ->] within haystack. If a sufficiently |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
183 * large match is found, matching bytes before n_pos are included |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
184 * in the match, too (within the limits of the arrays). |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
185 * |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
186 * @param haystack buffer that may contain parts of needle |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
187 * @param h_len length of the haystack buffer |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
188 * @param needle buffer containing source data that have been used to |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
189 * construct haystack |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
190 * @param n_pos start position in needle used for looking for matches |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
191 * @param n_len length of the needle buffer |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
192 * @param match_h_offset_ptr offset of the first matching byte within haystack |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
193 * @param match_n_offset_ptr offset of the first matching byte within needle |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
194 * @param match_len_ptr length of the matched segment |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
195 * @return 0 if a match was found, < 0 if no match was found |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
196 */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
197 static int match_segments(const uint8_t *haystack, int h_len, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
198 const uint8_t *needle, int n_pos, int n_len, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
199 int *match_h_offset_ptr, int *match_n_offset_ptr, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
200 int *match_len_ptr) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
201 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
202 int h_pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
203 for (h_pos = 0; h_pos < h_len; h_pos++) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
204 int match_len = 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
205 int match_h_pos, match_n_pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
206 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
207 /* Check how many bytes match at needle[n_pos] and haystack[h_pos] */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
208 while (h_pos + match_len < h_len && n_pos + match_len < n_len && |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
209 needle[n_pos + match_len] == haystack[h_pos + match_len]) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
210 match_len++; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
211 if (match_len <= 8) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
212 continue; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
213 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
214 /* If a sufficiently large match was found, try to expand |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
215 * the matched segment backwards. */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
216 match_h_pos = h_pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
217 match_n_pos = n_pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
218 while (match_n_pos > 0 && match_h_pos > 0 && |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
219 needle[match_n_pos - 1] == haystack[match_h_pos - 1]) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
220 match_n_pos--; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
221 match_h_pos--; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
222 match_len++; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
223 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
224 if (match_len <= 14) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
225 continue; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
226 *match_h_offset_ptr = match_h_pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
227 *match_n_offset_ptr = match_n_pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
228 *match_len_ptr = match_len; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
229 return 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
230 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
231 return -1; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
232 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
233 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
234 /** |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
235 * Look for segments in samples in the sample queue matching the data |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
236 * in ptr. Samples not matching are removed from the queue. If a match |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
237 * is found, the next time it will look for matches starting from the |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
238 * end of the previous matched segment. |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
239 * |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
240 * @param data data to find matches for in the sample queue |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
241 * @param len length of the data buffer |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
242 * @param queue samples used for looking for matching segments |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
243 * @param pos the offset in data of the matched segment |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
244 * @param match_sample the number of the sample that contained the match |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
245 * @param match_offset the offset of the matched segment within the sample |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
246 * @param match_len the length of the matched segment |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
247 * @return 0 if a match was found, < 0 if no match was found |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
248 */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
249 static int find_sample_match(const uint8_t *data, int len, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
250 HintSampleQueue *queue, int *pos, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
251 int *match_sample, int *match_offset, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
252 int *match_len) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
253 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
254 while (queue->len > 0) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
255 HintSample *sample = &queue->samples[0]; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
256 /* If looking for matches in a new sample, skip the first 5 bytes, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
257 * since they often may be modified/removed in the output packet. */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
258 if (sample->offset == 0 && sample->size > 5) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
259 sample->offset = 5; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
260 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
261 if (match_segments(data, len, sample->data, sample->offset, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
262 sample->size, pos, match_offset, match_len) == 0) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
263 *match_sample = sample->sample_number; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
264 /* Next time, look for matches at this offset, with a little |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
265 * margin to this match. */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
266 sample->offset = *match_offset + *match_len + 5; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
267 if (sample->offset + 10 >= sample->size) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
268 sample_queue_pop(queue); /* Not enough useful data left */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
269 return 0; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
270 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
271 |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
272 if (sample->offset < 10 && sample->size > 20) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
273 /* No match found from the start of the sample, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
274 * try from the middle of the sample instead. */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
275 sample->offset = sample->size/2; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
276 } else { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
277 /* No match for this sample, remove it */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
278 sample_queue_pop(queue); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
279 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
280 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
281 return -1; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
282 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
283 |
6013 | 284 static void output_immediate(const uint8_t *data, int size, |
285 ByteIOContext *out, int *entries) | |
286 { | |
287 while (size > 0) { | |
288 int len = size; | |
289 if (len > 14) | |
290 len = 14; | |
291 put_byte(out, 1); /* immediate constructor */ | |
292 put_byte(out, len); /* amount of valid data */ | |
293 put_buffer(out, data, len); | |
294 data += len; | |
295 size -= len; | |
296 | |
297 for (; len < 14; len++) | |
298 put_byte(out, 0); | |
299 | |
300 (*entries)++; | |
301 } | |
302 } | |
303 | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
304 static void output_match(ByteIOContext *out, int match_sample, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
305 int match_offset, int match_len, int *entries) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
306 { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
307 put_byte(out, 2); /* sample constructor */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
308 put_byte(out, 0); /* track reference */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
309 put_be16(out, match_len); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
310 put_be32(out, match_sample); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
311 put_be32(out, match_offset); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
312 put_be16(out, 1); /* bytes per block */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
313 put_be16(out, 1); /* samples per block */ |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
314 (*entries)++; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
315 } |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
316 |
6013 | 317 static void describe_payload(const uint8_t *data, int size, |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
318 ByteIOContext *out, int *entries, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
319 HintSampleQueue *queue) |
6013 | 320 { |
321 /* Describe the payload using different constructors */ | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
322 while (size > 0) { |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
323 int match_sample, match_offset, match_len, pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
324 if (find_sample_match(data, size, queue, &pos, &match_sample, |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
325 &match_offset, &match_len) < 0) |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
326 break; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
327 output_immediate(data, pos, out, entries); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
328 data += pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
329 size -= pos; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
330 output_match(out, match_sample, match_offset, match_len, entries); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
331 data += match_len; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
332 size -= match_len; |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
333 } |
6013 | 334 output_immediate(data, size, out, entries); |
335 } | |
336 | |
337 /** | |
338 * Write an RTP hint (that may contain one or more RTP packets) | |
339 * for the packets in data. data contains one or more packets with a | |
340 * BE32 size header. | |
341 * | |
342 * @param out buffer where the hints are written | |
343 * @param data buffer containing RTP packets | |
344 * @param size the size of the data buffer | |
345 * @param trk the MOVTrack for the hint track | |
346 * @param pts pointer where the timestamp for the written RTP hint is stored | |
347 * @return the number of RTP packets in the written hint | |
348 */ | |
349 static int write_hint_packets(ByteIOContext *out, const uint8_t *data, | |
350 int size, MOVTrack *trk, int64_t *pts) | |
351 { | |
352 int64_t curpos; | |
353 int64_t count_pos, entries_pos; | |
354 int count = 0, entries; | |
355 | |
356 count_pos = url_ftell(out); | |
357 /* RTPsample header */ | |
358 put_be16(out, 0); /* packet count */ | |
359 put_be16(out, 0); /* reserved */ | |
360 | |
361 while (size > 4) { | |
362 uint32_t packet_len = AV_RB32(data); | |
363 uint16_t seq; | |
364 uint32_t ts; | |
365 | |
366 data += 4; | |
367 size -= 4; | |
368 if (packet_len > size || packet_len <= 12) | |
369 break; | |
370 if (data[1] >= 200 && data[1] <= 204) { | |
371 /* RTCP packet, just skip */ | |
372 data += packet_len; | |
373 size -= packet_len; | |
374 continue; | |
375 } | |
376 | |
377 if (packet_len > trk->max_packet_size) | |
378 trk->max_packet_size = packet_len; | |
379 | |
380 seq = AV_RB16(&data[2]); | |
381 ts = AV_RB32(&data[4]); | |
382 | |
383 if (trk->prev_rtp_ts == 0) | |
384 trk->prev_rtp_ts = ts; | |
385 /* Unwrap the 32-bit RTP timestamp that wraps around often | |
386 * into a not (as often) wrapping 64-bit timestamp. */ | |
387 trk->cur_rtp_ts_unwrapped += (int32_t) (ts - trk->prev_rtp_ts); | |
388 trk->prev_rtp_ts = ts; | |
389 if (*pts == AV_NOPTS_VALUE) | |
390 *pts = trk->cur_rtp_ts_unwrapped; | |
391 | |
392 count++; | |
393 /* RTPpacket header */ | |
394 put_be32(out, 0); /* relative_time */ | |
395 put_buffer(out, data, 2); /* RTP header */ | |
396 put_be16(out, seq); /* RTPsequenceseed */ | |
397 put_be16(out, 0); /* reserved + flags */ | |
398 entries_pos = url_ftell(out); | |
399 put_be16(out, 0); /* entry count */ | |
400 | |
401 data += 12; | |
402 size -= 12; | |
403 packet_len -= 12; | |
404 | |
405 entries = 0; | |
406 /* Write one or more constructors describing the payload data */ | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
407 describe_payload(data, packet_len, out, &entries, &trk->sample_queue); |
6013 | 408 data += packet_len; |
409 size -= packet_len; | |
410 | |
411 curpos = url_ftell(out); | |
412 url_fseek(out, entries_pos, SEEK_SET); | |
413 put_be16(out, entries); | |
414 url_fseek(out, curpos, SEEK_SET); | |
415 } | |
416 | |
417 curpos = url_ftell(out); | |
418 url_fseek(out, count_pos, SEEK_SET); | |
419 put_be16(out, count); | |
420 url_fseek(out, curpos, SEEK_SET); | |
421 return count; | |
422 } | |
423 | |
424 int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt, | |
425 int track_index, int sample) | |
426 { | |
427 MOVMuxContext *mov = s->priv_data; | |
428 MOVTrack *trk = &mov->tracks[track_index]; | |
429 AVFormatContext *rtp_ctx = trk->rtp_ctx; | |
430 uint8_t *buf = NULL; | |
431 int size; | |
432 ByteIOContext *hintbuf = NULL; | |
433 AVPacket hint_pkt; | |
434 int ret = 0, count; | |
435 | |
436 if (!rtp_ctx) | |
437 return AVERROR(ENOENT); | |
438 if (!rtp_ctx->pb) | |
439 return AVERROR(ENOMEM); | |
440 | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
441 sample_queue_push(&trk->sample_queue, pkt, sample); |
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
442 |
6013 | 443 /* Feed the packet to the RTP muxer */ |
6025
fd7fc7d79630
Take ff_write_chained in use in the mov rtp hinter and in the rtsp muxer
mstorsjo
parents:
6014
diff
changeset
|
444 ff_write_chained(rtp_ctx, 0, pkt, s); |
6013 | 445 |
446 /* Fetch the output from the RTP muxer, open a new output buffer | |
447 * for next time. */ | |
448 size = url_close_dyn_buf(rtp_ctx->pb, &buf); | |
449 if ((ret = url_open_dyn_packet_buf(&rtp_ctx->pb, | |
450 RTP_MAX_PACKET_SIZE)) < 0) | |
451 goto done; | |
452 | |
453 if (size <= 0) | |
454 goto done; | |
455 | |
456 /* Open a buffer for writing the hint */ | |
457 if ((ret = url_open_dyn_buf(&hintbuf)) < 0) | |
458 goto done; | |
459 av_init_packet(&hint_pkt); | |
460 count = write_hint_packets(hintbuf, buf, size, trk, &hint_pkt.dts); | |
461 av_freep(&buf); | |
462 | |
463 /* Write the hint data into the hint track */ | |
464 hint_pkt.size = size = url_close_dyn_buf(hintbuf, &buf); | |
465 hint_pkt.data = buf; | |
466 hint_pkt.pts = hint_pkt.dts; | |
467 hint_pkt.stream_index = track_index; | |
468 if (pkt->flags & AV_PKT_FLAG_KEY) | |
469 hint_pkt.flags |= AV_PKT_FLAG_KEY; | |
470 if (count > 0) | |
471 ff_mov_write_packet(s, &hint_pkt); | |
472 done: | |
473 av_free(buf); | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
474 sample_queue_retain(&trk->sample_queue); |
6013 | 475 return ret; |
476 } | |
477 | |
478 void ff_mov_close_hinting(MOVTrack *track) { | |
479 AVFormatContext* rtp_ctx = track->rtp_ctx; | |
480 uint8_t *ptr; | |
481 | |
482 av_freep(&track->enc); | |
6014
b66058698117
Use a heuristic for describing the RTP packets using sample data
mstorsjo
parents:
6013
diff
changeset
|
483 sample_queue_free(&track->sample_queue); |
6013 | 484 if (!rtp_ctx) |
485 return; | |
486 if (rtp_ctx->pb) { | |
487 av_write_trailer(rtp_ctx); | |
488 url_close_dyn_buf(rtp_ctx->pb, &ptr); | |
489 av_free(ptr); | |
490 } | |
491 av_metadata_free(&rtp_ctx->streams[0]->metadata); | |
492 av_metadata_free(&rtp_ctx->metadata); | |
493 av_free(rtp_ctx->streams[0]); | |
494 av_freep(&rtp_ctx); | |
495 } | |
496 |