/* write optional descriptors here */
switch(st->codec->codec_type) {
case AVMEDIA_TYPE_AUDIO:
- if (lang && strlen(lang->value) == 3) {
+ if (lang) {
+ char *p;
+ char *next = lang->value;
+ uint8_t *len_ptr;
+
*q++ = 0x0a; /* ISO 639 language descriptor */
- *q++ = 4;
- *q++ = lang->value[0];
- *q++ = lang->value[1];
- *q++ = lang->value[2];
+ len_ptr = q++;
+ *len_ptr = 0;
+
+ for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
+ next = strchr(p, ',');
+ if (strlen(p) != 3 && (!next || next != p + 3))
+ continue; /* not a 3-letter code */
+
+ *q++ = *p++;
+ *q++ = *p++;
+ *q++ = *p++;
+
if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
*q++ = 0x01;
else if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
*q++ = 0x03;
else
*q++ = 0; /* undefined type */
+
+ *len_ptr += 4;
+ }
+
+ if (*len_ptr == 0)
+ q -= 2; /* no language codes were written */
}
break;
case AVMEDIA_TYPE_SUBTITLE:
static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
{
AVFormatContext *ctx = s->opaque;
- put_buffer(ctx->pb, packet, TS_PACKET_SIZE);
+ avio_write(ctx->pb, packet, TS_PACKET_SIZE);
}
static int mpegts_write_header(AVFormatContext *s)
service->pcr_packet_period,
ts->sdt_packet_period, ts->pat_packet_period);
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
return 0;
}
}
-static int64_t get_pcr(const MpegTSWrite *ts, ByteIOContext *pb)
+static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
{
- return av_rescale(url_ftell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
+ return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
ts->first_pcr;
}
*q++ = 0xff;
*q++ = 0x10;
memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
- put_buffer(s->pb, buf, TS_PACKET_SIZE);
+ avio_write(s->pb, buf, TS_PACKET_SIZE);
}
/* Write a single transport stream packet with a PCR and no payload */
/* stuffing bytes */
memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
- put_buffer(s->pb, buf, TS_PACKET_SIZE);
+ avio_write(s->pb, buf, TS_PACKET_SIZE);
}
static void write_pts(uint8_t *q, int fourbits, int64_t pts)
*q++ = 0xe0;
} else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
(st->codec->codec_id == CODEC_ID_MP2 ||
- st->codec->codec_id == CODEC_ID_MP3)) {
+ st->codec->codec_id == CODEC_ID_MP3 ||
+ st->codec->codec_id == CODEC_ID_AAC)) {
*q++ = 0xc0;
} else {
*q++ = 0xbd;
memcpy(buf + TS_PACKET_SIZE - len, payload, len);
payload += len;
payload_size -= len;
- put_buffer(s->pb, buf, TS_PACKET_SIZE);
+ avio_write(s->pb, buf, TS_PACKET_SIZE);
}
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
}
static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
}
av_freep(&ts_st->adts);
}
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
for(i = 0; i < ts->nb_services; i++) {
service = ts->services[i];