Lines Matching refs:os

78 static int parse_header(OutputStream *os, const uint8_t *buf, int buf_size)
92 if (os->nb_extra_packets >= FF_ARRAY_ELEMS(os->extra_packets))
94 os->extra_packet_sizes[os->nb_extra_packets] = size;
95 os->extra_packets[os->nb_extra_packets] = av_memdup(buf, size);
96 if (!os->extra_packets[os->nb_extra_packets])
98 os->nb_extra_packets++;
100 if (os->metadata)
102 os->metadata_size = size - 11 - 4;
103 os->metadata = av_memdup(buf + 11, os->metadata_size);
104 if (!os->metadata)
110 if (!os->metadata)
117 OutputStream *os = opaque;
118 if (os->out) {
119 avio_write(os->out, buf, buf_size);
121 if (!os->metadata_size) {
125 if ((ret = parse_header(os, buf, buf_size)) < 0)
139 OutputStream *os = &c->streams[i];
140 if (os->out)
141 ff_format_io_close(s, &os->out);
142 if (os->ctx && os->ctx_inited)
143 av_write_trailer(os->ctx);
144 if (os->ctx)
145 avio_context_free(&os->ctx->pb);
146 avformat_free_context(os->ctx);
147 av_freep(&os->metadata);
148 for (j = 0; j < os->nb_extra_packets; j++)
149 av_freep(&os->extra_packets[j]);
150 for (j = 0; j < os->nb_fragments; j++)
151 av_freep(&os->fragments[j]);
152 av_freep(&os->fragments);
184 OutputStream *os = &c->streams[i];
185 int b64_size = AV_BASE64_SIZE(os->metadata_size);
191 av_base64_encode(base64, b64_size, os->metadata, os->metadata_size);
194 avio_printf(out, "\t<media bitrate=\"%d\" url=\"stream%d\" bootstrapInfoId=\"bootstrap%d\">\n", os->bitrate/1000, i, i);
216 static int write_abst(AVFormatContext *s, OutputStream *os, int final)
224 int index = s->streams[os->first_stream]->id;
227 start = FFMAX(os->nb_fragments - c->window_size, 0);
228 fragments = os->nb_fragments - start;
230 cur_media_time = os->last_ts;
231 else if (os->nb_fragments)
232 cur_media_time = os->fragments[os->nb_fragments - 1]->start_time;
246 avio_wb32(out, os->fragment_index - 1); // BootstrapinfoVersion
264 avio_wb32(out, final ? (os->fragment_index - 1) : 0xffffffff); // FragmentsPerSegment
274 for (i = start; i < os->nb_fragments; i++) {
275 avio_wb32(out, os->fragments[i]->n);
276 avio_wb64(out, os->fragments[i]->start_time);
277 avio_wb32(out, os->fragments[i]->duration);
285 static int init_file(AVFormatContext *s, OutputStream *os, int64_t start_ts)
288 ret = s->io_open(s, &os->out, os->temp_filename, AVIO_FLAG_WRITE, NULL);
291 avio_wb32(os->out, 0);
292 avio_wl32(os->out, MKTAG('m','d','a','t'));
293 for (i = 0; i < os->nb_extra_packets; i++) {
294 AV_WB24(os->extra_packets[i] + 4, start_ts);
295 os->extra_packets[i][7] = (start_ts >> 24) & 0x7f;
296 avio_write(os->out, os->extra_packets[i], os->extra_packet_sizes[i]);
301 static void close_file(AVFormatContext *s, OutputStream *os)
303 int64_t pos = avio_tell(os->out);
304 avio_seek(os->out, 0, SEEK_SET);
305 avio_wb32(os->out, pos);
306 avio_flush(os->out);
307 ff_format_io_close(s, &os->out);
332 OutputStream *os = &c->streams[c->nb_streams];
341 if (os->has_video) {
343 os++;
345 os->has_video = 1;
347 if (os->has_audio) {
349 os++;
351 os->has_audio = 1;
356 os->bitrate += s->streams[i]->codecpar->bit_rate;
358 if (!os->ctx) {
359 os->first_stream = i;
364 os->ctx = ctx;
369 ctx->pb = avio_alloc_context(os->iobuf, sizeof(os->iobuf),
370 1, os,
376 ctx = os->ctx;
392 OutputStream *os = &c->streams[i];
394 if ((ret = avformat_write_header(os->ctx, NULL)) < 0) {
397 os->ctx_inited = 1;
398 avio_flush(os->ctx->pb);
399 for (j = 0; j < os->ctx->nb_streams; j++)
400 s->streams[os->first_stream + j]->time_base = os->ctx->streams[j]->time_base;
402 snprintf(os->temp_filename, sizeof(os->temp_filename),
404 ret = init_file(s, os, 0);
408 if (!os->has_video && c->min_frag_duration <= 0) {
412 os->fragment_index = 1;
413 write_abst(s, os, 0);
420 static int add_fragment(OutputStream *os, const char *file,
426 if (os->nb_fragments >= os->fragments_size) {
428 os->fragments_size = (os->fragments_size + 1) * 2;
429 if ((ret = av_reallocp_array(&os->fragments, os->fragments_size,
430 sizeof(*os->fragments))) < 0) {
431 os->fragments_size = 0;
432 os->nb_fragments = 0;
442 frag->n = os->fragment_index;
443 os->fragments[os->nb_fragments++] = frag;
444 os->fragment_index++;
448 static int hds_flush(AVFormatContext *s, OutputStream *os, int final,
454 int index = s->streams[os->first_stream]->id;
456 if (!os->packets_written)
459 avio_flush(os->ctx->pb);
460 os->packets_written = 0;
461 close_file(s, os);
464 "%s/stream%dSeg1-Frag%d", s->url, index, os->fragment_index);
465 ret = ff_rename(os->temp_filename, target_filename, s);
468 add_fragment(os, target_filename, os->frag_start_ts, end_ts - os->frag_start_ts);
471 ret = init_file(s, os, end_ts);
477 int remove = os->nb_fragments - c->window_size - c->extra_window_size;
479 remove = os->nb_fragments;
482 unlink(os->fragments[i]->file);
483 av_freep(&os->fragments[i]);
485 os->nb_fragments -= remove;
486 memmove(os->fragments, os->fragments + remove,
487 os->nb_fragments * sizeof(*os->fragments));
492 ret = write_abst(s, os, final);
501 OutputStream *os = &c->streams[s->streams[pkt->stream_index]->id];
502 int64_t end_dts = os->fragment_index * (int64_t)c->min_frag_duration;
508 if ((!os->has_video || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) &&
511 pkt->flags & AV_PKT_FLAG_KEY && os->packets_written) {
513 if ((ret = hds_flush(s, os, 0, pkt->dts)) < 0)
519 if (!os->packets_written)
520 os->frag_start_ts = pkt->dts;
521 os->last_ts = pkt->dts;
523 os->packets_written++;
524 return ff_write_chained(os->ctx, pkt->stream_index - os->first_stream, pkt, s, 0);