Libav 0.7.1
libavformat/mpegtsenc.c
Go to the documentation of this file.
00001 /*
00002  * MPEG2 transport stream (aka DVB) muxer
00003  * Copyright (c) 2003 Fabrice Bellard
00004  *
00005  * This file is part of Libav.
00006  *
00007  * Libav is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * Libav is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with Libav; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00020  */
00021 
00022 #include "libavutil/bswap.h"
00023 #include "libavutil/crc.h"
00024 #include "libavutil/dict.h"
00025 #include "libavutil/opt.h"
00026 #include "libavcodec/mpegvideo.h"
00027 #include "avformat.h"
00028 #include "internal.h"
00029 #include "mpegts.h"
00030 #include "adts.h"
00031 
00032 #define PCR_TIME_BASE 27000000
00033 
00034 /* write DVB SI sections */
00035 
00036 /*********************************************/
00037 /* mpegts section writer */
00038 
00039 typedef struct MpegTSSection {
00040     int pid;
00041     int cc;
00042     void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet);
00043     void *opaque;
00044 } MpegTSSection;
00045 
00046 typedef struct MpegTSService {
00047     MpegTSSection pmt; /* MPEG2 pmt table context */
00048     int sid;           /* service ID */
00049     char *name;
00050     char *provider_name;
00051     int pcr_pid;
00052     int pcr_packet_count;
00053     int pcr_packet_period;
00054 } MpegTSService;
00055 
00056 typedef struct MpegTSWrite {
00057     const AVClass *av_class;
00058     MpegTSSection pat; /* MPEG2 pat table */
00059     MpegTSSection sdt; /* MPEG2 sdt table context */
00060     MpegTSService **services;
00061     int sdt_packet_count;
00062     int sdt_packet_period;
00063     int pat_packet_count;
00064     int pat_packet_period;
00065     int nb_services;
00066     int onid;
00067     int tsid;
00068     int64_t first_pcr;
00069     int mux_rate; 
00070 
00071     int transport_stream_id;
00072     int original_network_id;
00073     int service_id;
00074 
00075     int pmt_start_pid;
00076     int start_pid;
00077 } MpegTSWrite;
00078 
00079 static const AVOption options[] = {
00080     { "mpegts_transport_stream_id", "Set transport_stream_id field.",
00081       offsetof(MpegTSWrite, transport_stream_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
00082     { "mpegts_original_network_id", "Set original_network_id field.",
00083       offsetof(MpegTSWrite, original_network_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
00084     { "mpegts_service_id", "Set service_id field.",
00085       offsetof(MpegTSWrite, service_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
00086     { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
00087       offsetof(MpegTSWrite, pmt_start_pid), FF_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
00088     { "mpegts_start_pid", "Set the first pid.",
00089       offsetof(MpegTSWrite, start_pid), FF_OPT_TYPE_INT, {.dbl = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
00090     { NULL },
00091 };
00092 
00093 static const AVClass mpegts_muxer_class = {
00094     .class_name     = "MPEGTS muxer",
00095     .item_name      = av_default_item_name,
00096     .option         = options,
00097     .version        = LIBAVUTIL_VERSION_INT,
00098 };
00099 
00100 /* NOTE: 4 bytes must be left at the end for the crc32 */
00101 static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
00102 {
00103     unsigned int crc;
00104     unsigned char packet[TS_PACKET_SIZE];
00105     const unsigned char *buf_ptr;
00106     unsigned char *q;
00107     int first, b, len1, left;
00108 
00109     crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4));
00110     buf[len - 4] = (crc >> 24) & 0xff;
00111     buf[len - 3] = (crc >> 16) & 0xff;
00112     buf[len - 2] = (crc >> 8) & 0xff;
00113     buf[len - 1] = (crc) & 0xff;
00114 
00115     /* send each packet */
00116     buf_ptr = buf;
00117     while (len > 0) {
00118         first = (buf == buf_ptr);
00119         q = packet;
00120         *q++ = 0x47;
00121         b = (s->pid >> 8);
00122         if (first)
00123             b |= 0x40;
00124         *q++ = b;
00125         *q++ = s->pid;
00126         s->cc = (s->cc + 1) & 0xf;
00127         *q++ = 0x10 | s->cc;
00128         if (first)
00129             *q++ = 0; /* 0 offset */
00130         len1 = TS_PACKET_SIZE - (q - packet);
00131         if (len1 > len)
00132             len1 = len;
00133         memcpy(q, buf_ptr, len1);
00134         q += len1;
00135         /* add known padding data */
00136         left = TS_PACKET_SIZE - (q - packet);
00137         if (left > 0)
00138             memset(q, 0xff, left);
00139 
00140         s->write_packet(s, packet);
00141 
00142         buf_ptr += len1;
00143         len -= len1;
00144     }
00145 }
00146 
00147 static inline void put16(uint8_t **q_ptr, int val)
00148 {
00149     uint8_t *q;
00150     q = *q_ptr;
00151     *q++ = val >> 8;
00152     *q++ = val;
00153     *q_ptr = q;
00154 }
00155 
00156 static int mpegts_write_section1(MpegTSSection *s, int tid, int id,
00157                           int version, int sec_num, int last_sec_num,
00158                           uint8_t *buf, int len)
00159 {
00160     uint8_t section[1024], *q;
00161     unsigned int tot_len;
00162     /* reserved_future_use field must be set to 1 for SDT */
00163     unsigned int flags = tid == SDT_TID ? 0xf000 : 0xb000;
00164 
00165     tot_len = 3 + 5 + len + 4;
00166     /* check if not too big */
00167     if (tot_len > 1024)
00168         return -1;
00169 
00170     q = section;
00171     *q++ = tid;
00172     put16(&q, flags | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */
00173     put16(&q, id);
00174     *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */
00175     *q++ = sec_num;
00176     *q++ = last_sec_num;
00177     memcpy(q, buf, len);
00178 
00179     mpegts_write_section(s, section, tot_len);
00180     return 0;
00181 }
00182 
00183 /*********************************************/
00184 /* mpegts writer */
00185 
00186 #define DEFAULT_PROVIDER_NAME   "Libav"
00187 #define DEFAULT_SERVICE_NAME    "Service01"
00188 
00189 /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
00190 #define DEFAULT_PES_HEADER_FREQ 16
00191 #define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)
00192 
00193 /* we retransmit the SI info at this rate */
00194 #define SDT_RETRANS_TIME 500
00195 #define PAT_RETRANS_TIME 100
00196 #define PCR_RETRANS_TIME 20
00197 
00198 typedef struct MpegTSWriteStream {
00199     struct MpegTSService *service;
00200     int pid; /* stream associated pid */
00201     int cc;
00202     int payload_index;
00203     int first_pts_check; 
00204     int64_t payload_pts;
00205     int64_t payload_dts;
00206     uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE];
00207     ADTSContext *adts;
00208 } MpegTSWriteStream;
00209 
00210 static void mpegts_write_pat(AVFormatContext *s)
00211 {
00212     MpegTSWrite *ts = s->priv_data;
00213     MpegTSService *service;
00214     uint8_t data[1012], *q;
00215     int i;
00216 
00217     q = data;
00218     for(i = 0; i < ts->nb_services; i++) {
00219         service = ts->services[i];
00220         put16(&q, service->sid);
00221         put16(&q, 0xe000 | service->pmt.pid);
00222     }
00223     mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, 0, 0, 0,
00224                           data, q - data);
00225 }
00226 
00227 static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
00228 {
00229     //    MpegTSWrite *ts = s->priv_data;
00230     uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr;
00231     int val, stream_type, i;
00232 
00233     q = data;
00234     put16(&q, 0xe000 | service->pcr_pid);
00235 
00236     program_info_length_ptr = q;
00237     q += 2; /* patched after */
00238 
00239     /* put program info here */
00240 
00241     val = 0xf000 | (q - program_info_length_ptr - 2);
00242     program_info_length_ptr[0] = val >> 8;
00243     program_info_length_ptr[1] = val;
00244 
00245     for(i = 0; i < s->nb_streams; i++) {
00246         AVStream *st = s->streams[i];
00247         MpegTSWriteStream *ts_st = st->priv_data;
00248         AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL,0);
00249         switch(st->codec->codec_id) {
00250         case CODEC_ID_MPEG1VIDEO:
00251         case CODEC_ID_MPEG2VIDEO:
00252             stream_type = STREAM_TYPE_VIDEO_MPEG2;
00253             break;
00254         case CODEC_ID_MPEG4:
00255             stream_type = STREAM_TYPE_VIDEO_MPEG4;
00256             break;
00257         case CODEC_ID_H264:
00258             stream_type = STREAM_TYPE_VIDEO_H264;
00259             break;
00260         case CODEC_ID_DIRAC:
00261             stream_type = STREAM_TYPE_VIDEO_DIRAC;
00262             break;
00263         case CODEC_ID_MP2:
00264         case CODEC_ID_MP3:
00265             stream_type = STREAM_TYPE_AUDIO_MPEG1;
00266             break;
00267         case CODEC_ID_AAC:
00268             stream_type = STREAM_TYPE_AUDIO_AAC;
00269             break;
00270         case CODEC_ID_AAC_LATM:
00271             stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
00272             break;
00273         case CODEC_ID_AC3:
00274             stream_type = STREAM_TYPE_AUDIO_AC3;
00275             break;
00276         default:
00277             stream_type = STREAM_TYPE_PRIVATE_DATA;
00278             break;
00279         }
00280         *q++ = stream_type;
00281         put16(&q, 0xe000 | ts_st->pid);
00282         desc_length_ptr = q;
00283         q += 2; /* patched after */
00284 
00285         /* write optional descriptors here */
00286         switch(st->codec->codec_type) {
00287         case AVMEDIA_TYPE_AUDIO:
00288             if (lang) {
00289                 char *p;
00290                 char *next = lang->value;
00291                 uint8_t *len_ptr;
00292 
00293                 *q++ = 0x0a; /* ISO 639 language descriptor */
00294                 len_ptr = q++;
00295                 *len_ptr = 0;
00296 
00297                 for (p = lang->value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
00298                     next = strchr(p, ',');
00299                     if (strlen(p) != 3 && (!next || next != p + 3))
00300                         continue; /* not a 3-letter code */
00301 
00302                     *q++ = *p++;
00303                     *q++ = *p++;
00304                     *q++ = *p++;
00305 
00306                 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
00307                     *q++ = 0x01;
00308                 else if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
00309                     *q++ = 0x02;
00310                 else if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
00311                     *q++ = 0x03;
00312                 else
00313                     *q++ = 0; /* undefined type */
00314 
00315                     *len_ptr += 4;
00316                 }
00317 
00318                 if (*len_ptr == 0)
00319                     q -= 2; /* no language codes were written */
00320             }
00321             break;
00322         case AVMEDIA_TYPE_SUBTITLE:
00323             {
00324                 const char *language;
00325                 language = lang && strlen(lang->value)==3 ? lang->value : "eng";
00326                 *q++ = 0x59;
00327                 *q++ = 8;
00328                 *q++ = language[0];
00329                 *q++ = language[1];
00330                 *q++ = language[2];
00331                 *q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */
00332                 if(st->codec->extradata_size == 4) {
00333                     memcpy(q, st->codec->extradata, 4);
00334                     q += 4;
00335                 } else {
00336                     put16(&q, 1); /* page id */
00337                     put16(&q, 1); /* ancillary page id */
00338                 }
00339             }
00340             break;
00341         case AVMEDIA_TYPE_VIDEO:
00342             if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
00343                 *q++ = 0x05; /*MPEG-2 registration descriptor*/
00344                 *q++ = 4;
00345                 *q++ = 'd';
00346                 *q++ = 'r';
00347                 *q++ = 'a';
00348                 *q++ = 'c';
00349             }
00350             break;
00351         }
00352 
00353         val = 0xf000 | (q - desc_length_ptr - 2);
00354         desc_length_ptr[0] = val >> 8;
00355         desc_length_ptr[1] = val;
00356     }
00357     mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0,
00358                           data, q - data);
00359 }
00360 
00361 /* NOTE: str == NULL is accepted for an empty string */
00362 static void putstr8(uint8_t **q_ptr, const char *str)
00363 {
00364     uint8_t *q;
00365     int len;
00366 
00367     q = *q_ptr;
00368     if (!str)
00369         len = 0;
00370     else
00371         len = strlen(str);
00372     *q++ = len;
00373     memcpy(q, str, len);
00374     q += len;
00375     *q_ptr = q;
00376 }
00377 
00378 static void mpegts_write_sdt(AVFormatContext *s)
00379 {
00380     MpegTSWrite *ts = s->priv_data;
00381     MpegTSService *service;
00382     uint8_t data[1012], *q, *desc_list_len_ptr, *desc_len_ptr;
00383     int i, running_status, free_ca_mode, val;
00384 
00385     q = data;
00386     put16(&q, ts->onid);
00387     *q++ = 0xff;
00388     for(i = 0; i < ts->nb_services; i++) {
00389         service = ts->services[i];
00390         put16(&q, service->sid);
00391         *q++ = 0xfc | 0x00; /* currently no EIT info */
00392         desc_list_len_ptr = q;
00393         q += 2;
00394         running_status = 4; /* running */
00395         free_ca_mode = 0;
00396 
00397         /* write only one descriptor for the service name and provider */
00398         *q++ = 0x48;
00399         desc_len_ptr = q;
00400         q++;
00401         *q++ = 0x01; /* digital television service */
00402         putstr8(&q, service->provider_name);
00403         putstr8(&q, service->name);
00404         desc_len_ptr[0] = q - desc_len_ptr - 1;
00405 
00406         /* fill descriptor length */
00407         val = (running_status << 13) | (free_ca_mode << 12) |
00408             (q - desc_list_len_ptr - 2);
00409         desc_list_len_ptr[0] = val >> 8;
00410         desc_list_len_ptr[1] = val;
00411     }
00412     mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, 0, 0, 0,
00413                           data, q - data);
00414 }
00415 
00416 static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
00417                                          int sid,
00418                                          const char *provider_name,
00419                                          const char *name)
00420 {
00421     MpegTSService *service;
00422 
00423     service = av_mallocz(sizeof(MpegTSService));
00424     if (!service)
00425         return NULL;
00426     service->pmt.pid = ts->pmt_start_pid + ts->nb_services;
00427     service->sid = sid;
00428     service->provider_name = av_strdup(provider_name);
00429     service->name = av_strdup(name);
00430     service->pcr_pid = 0x1fff;
00431     dynarray_add(&ts->services, &ts->nb_services, service);
00432     return service;
00433 }
00434 
00435 static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
00436 {
00437     AVFormatContext *ctx = s->opaque;
00438     avio_write(ctx->pb, packet, TS_PACKET_SIZE);
00439 }
00440 
00441 static int mpegts_write_header(AVFormatContext *s)
00442 {
00443     MpegTSWrite *ts = s->priv_data;
00444     MpegTSWriteStream *ts_st;
00445     MpegTSService *service;
00446     AVStream *st, *pcr_st = NULL;
00447     AVDictionaryEntry *title, *provider;
00448     int i, j;
00449     const char *service_name;
00450     const char *provider_name;
00451     int *pids;
00452 
00453     ts->tsid = ts->transport_stream_id;
00454     ts->onid = ts->original_network_id;
00455     /* allocate a single DVB service */
00456     title = av_dict_get(s->metadata, "service_name", NULL, 0);
00457     if (!title)
00458         title = av_dict_get(s->metadata, "title", NULL, 0);
00459     service_name = title ? title->value : DEFAULT_SERVICE_NAME;
00460     provider = av_dict_get(s->metadata, "service_provider", NULL, 0);
00461     provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
00462     service = mpegts_add_service(ts, ts->service_id, provider_name, service_name);
00463     service->pmt.write_packet = section_write_packet;
00464     service->pmt.opaque = s;
00465     service->pmt.cc = 15;
00466 
00467     ts->pat.pid = PAT_PID;
00468     ts->pat.cc = 15; // Initialize at 15 so that it wraps and be equal to 0 for the first packet we write
00469     ts->pat.write_packet = section_write_packet;
00470     ts->pat.opaque = s;
00471 
00472     ts->sdt.pid = SDT_PID;
00473     ts->sdt.cc = 15;
00474     ts->sdt.write_packet = section_write_packet;
00475     ts->sdt.opaque = s;
00476 
00477     pids = av_malloc(s->nb_streams * sizeof(*pids));
00478     if (!pids)
00479         return AVERROR(ENOMEM);
00480 
00481     /* assign pids to each stream */
00482     for(i = 0;i < s->nb_streams; i++) {
00483         st = s->streams[i];
00484         av_set_pts_info(st, 33, 1, 90000);
00485         ts_st = av_mallocz(sizeof(MpegTSWriteStream));
00486         if (!ts_st)
00487             goto fail;
00488         st->priv_data = ts_st;
00489         ts_st->service = service;
00490         /* MPEG pid values < 16 are reserved. Applications which set st->id in
00491          * this range are assigned a calculated pid. */
00492         if (st->id < 16) {
00493             ts_st->pid = ts->start_pid + i;
00494         } else if (st->id < 0x1FFF) {
00495             ts_st->pid = st->id;
00496         } else {
00497             av_log(s, AV_LOG_ERROR, "Invalid stream id %d, must be less than 8191\n", st->id);
00498             goto fail;
00499         }
00500         if (ts_st->pid == service->pmt.pid) {
00501             av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
00502             goto fail;
00503         }
00504         for (j = 0; j < i; j++)
00505             if (pids[j] == ts_st->pid) {
00506                 av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
00507                 goto fail;
00508             }
00509         pids[i] = ts_st->pid;
00510         ts_st->payload_pts = AV_NOPTS_VALUE;
00511         ts_st->payload_dts = AV_NOPTS_VALUE;
00512         ts_st->first_pts_check = 1;
00513         ts_st->cc = 15;
00514         /* update PCR pid by using the first video stream */
00515         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
00516             service->pcr_pid == 0x1fff) {
00517             service->pcr_pid = ts_st->pid;
00518             pcr_st = st;
00519         }
00520         if (st->codec->codec_id == CODEC_ID_AAC &&
00521             st->codec->extradata_size > 0) {
00522             ts_st->adts = av_mallocz(sizeof(*ts_st->adts));
00523             if (!ts_st->adts)
00524                 return AVERROR(ENOMEM);
00525             if (ff_adts_decode_extradata(s, ts_st->adts, st->codec->extradata,
00526                                          st->codec->extradata_size) < 0)
00527                 return -1;
00528         }
00529     }
00530 
00531     av_free(pids);
00532 
00533     /* if no video stream, use the first stream as PCR */
00534     if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
00535         pcr_st = s->streams[0];
00536         ts_st = pcr_st->priv_data;
00537         service->pcr_pid = ts_st->pid;
00538     }
00539 
00540     ts->mux_rate = s->mux_rate ? s->mux_rate : 1;
00541 
00542     if (ts->mux_rate > 1) {
00543         service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) /
00544             (TS_PACKET_SIZE * 8 * 1000);
00545         ts->sdt_packet_period      = (ts->mux_rate * SDT_RETRANS_TIME) /
00546             (TS_PACKET_SIZE * 8 * 1000);
00547         ts->pat_packet_period      = (ts->mux_rate * PAT_RETRANS_TIME) /
00548             (TS_PACKET_SIZE * 8 * 1000);
00549 
00550         ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
00551     } else {
00552         /* Arbitrary values, PAT/PMT could be written on key frames */
00553         ts->sdt_packet_period = 200;
00554         ts->pat_packet_period = 40;
00555         if (pcr_st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
00556             if (!pcr_st->codec->frame_size) {
00557                 av_log(s, AV_LOG_WARNING, "frame size not set\n");
00558                 service->pcr_packet_period =
00559                     pcr_st->codec->sample_rate/(10*512);
00560             } else {
00561                 service->pcr_packet_period =
00562                     pcr_st->codec->sample_rate/(10*pcr_st->codec->frame_size);
00563             }
00564         } else {
00565             // max delta PCR 0.1s
00566             service->pcr_packet_period =
00567                 pcr_st->codec->time_base.den/(10*pcr_st->codec->time_base.num);
00568         }
00569     }
00570 
00571     // output a PCR as soon as possible
00572     service->pcr_packet_count = service->pcr_packet_period;
00573     ts->pat_packet_count = ts->pat_packet_period-1;
00574     ts->sdt_packet_count = ts->sdt_packet_period-1;
00575 
00576     if (ts->mux_rate == 1)
00577         av_log(s, AV_LOG_INFO, "muxrate VBR, ");
00578     else
00579         av_log(s, AV_LOG_INFO, "muxrate %d, ", ts->mux_rate);
00580     av_log(s, AV_LOG_INFO, "pcr every %d pkts, "
00581            "sdt every %d, pat/pmt every %d pkts\n",
00582            service->pcr_packet_period,
00583            ts->sdt_packet_period, ts->pat_packet_period);
00584 
00585     avio_flush(s->pb);
00586 
00587     return 0;
00588 
00589  fail:
00590     av_free(pids);
00591     for(i = 0;i < s->nb_streams; i++) {
00592         st = s->streams[i];
00593         av_freep(&st->priv_data);
00594     }
00595     return -1;
00596 }
00597 
00598 /* send SDT, PAT and PMT tables regulary */
00599 static void retransmit_si_info(AVFormatContext *s)
00600 {
00601     MpegTSWrite *ts = s->priv_data;
00602     int i;
00603 
00604     if (++ts->sdt_packet_count == ts->sdt_packet_period) {
00605         ts->sdt_packet_count = 0;
00606         mpegts_write_sdt(s);
00607     }
00608     if (++ts->pat_packet_count == ts->pat_packet_period) {
00609         ts->pat_packet_count = 0;
00610         mpegts_write_pat(s);
00611         for(i = 0; i < ts->nb_services; i++) {
00612             mpegts_write_pmt(s, ts->services[i]);
00613         }
00614     }
00615 }
00616 
00617 static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
00618 {
00619     return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
00620            ts->first_pcr;
00621 }
00622 
00623 static uint8_t* write_pcr_bits(uint8_t *buf, int64_t pcr)
00624 {
00625     int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;
00626 
00627     *buf++ = pcr_high >> 25;
00628     *buf++ = pcr_high >> 17;
00629     *buf++ = pcr_high >> 9;
00630     *buf++ = pcr_high >> 1;
00631     *buf++ = pcr_high << 7 | pcr_low >> 8 | 0x7e;
00632     *buf++ = pcr_low;
00633 
00634     return buf;
00635 }
00636 
00637 /* Write a single null transport stream packet */
00638 static void mpegts_insert_null_packet(AVFormatContext *s)
00639 {
00640     uint8_t *q;
00641     uint8_t buf[TS_PACKET_SIZE];
00642 
00643     q = buf;
00644     *q++ = 0x47;
00645     *q++ = 0x00 | 0x1f;
00646     *q++ = 0xff;
00647     *q++ = 0x10;
00648     memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
00649     avio_write(s->pb, buf, TS_PACKET_SIZE);
00650 }
00651 
00652 /* Write a single transport stream packet with a PCR and no payload */
00653 static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st)
00654 {
00655     MpegTSWrite *ts = s->priv_data;
00656     MpegTSWriteStream *ts_st = st->priv_data;
00657     uint8_t *q;
00658     uint8_t buf[TS_PACKET_SIZE];
00659 
00660     q = buf;
00661     *q++ = 0x47;
00662     *q++ = ts_st->pid >> 8;
00663     *q++ = ts_st->pid;
00664     *q++ = 0x20 | ts_st->cc;   /* Adaptation only */
00665     /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
00666     *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
00667     *q++ = 0x10;               /* Adaptation flags: PCR present */
00668 
00669     /* PCR coded into 6 bytes */
00670     q = write_pcr_bits(q, get_pcr(ts, s->pb));
00671 
00672     /* stuffing bytes */
00673     memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
00674     avio_write(s->pb, buf, TS_PACKET_SIZE);
00675 }
00676 
00677 static void write_pts(uint8_t *q, int fourbits, int64_t pts)
00678 {
00679     int val;
00680 
00681     val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
00682     *q++ = val;
00683     val = (((pts >> 15) & 0x7fff) << 1) | 1;
00684     *q++ = val >> 8;
00685     *q++ = val;
00686     val = (((pts) & 0x7fff) << 1) | 1;
00687     *q++ = val >> 8;
00688     *q++ = val;
00689 }
00690 
00691 /* Add a pes header to the front of payload, and segment into an integer number of
00692  * ts packets. The final ts packet is padded using an over-sized adaptation header
00693  * to exactly fill the last ts packet.
00694  * NOTE: 'payload' contains a complete PES payload.
00695  */
00696 static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
00697                              const uint8_t *payload, int payload_size,
00698                              int64_t pts, int64_t dts)
00699 {
00700     MpegTSWriteStream *ts_st = st->priv_data;
00701     MpegTSWrite *ts = s->priv_data;
00702     uint8_t buf[TS_PACKET_SIZE];
00703     uint8_t *q;
00704     int val, is_start, len, header_len, write_pcr, private_code, flags;
00705     int afc_len, stuffing_len;
00706     int64_t pcr = -1; /* avoid warning */
00707     int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
00708 
00709     is_start = 1;
00710     while (payload_size > 0) {
00711         retransmit_si_info(s);
00712 
00713         write_pcr = 0;
00714         if (ts_st->pid == ts_st->service->pcr_pid) {
00715             if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
00716                 ts_st->service->pcr_packet_count++;
00717             if (ts_st->service->pcr_packet_count >=
00718                 ts_st->service->pcr_packet_period) {
00719                 ts_st->service->pcr_packet_count = 0;
00720                 write_pcr = 1;
00721             }
00722         }
00723 
00724         if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
00725             (dts - get_pcr(ts, s->pb)/300) > delay) {
00726             /* pcr insert gets priority over null packet insert */
00727             if (write_pcr)
00728                 mpegts_insert_pcr_only(s, st);
00729             else
00730                 mpegts_insert_null_packet(s);
00731             continue; /* recalculate write_pcr and possibly retransmit si_info */
00732         }
00733 
00734         /* prepare packet header */
00735         q = buf;
00736         *q++ = 0x47;
00737         val = (ts_st->pid >> 8);
00738         if (is_start)
00739             val |= 0x40;
00740         *q++ = val;
00741         *q++ = ts_st->pid;
00742         ts_st->cc = (ts_st->cc + 1) & 0xf;
00743         *q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0);
00744         if (write_pcr) {
00745             // add 11, pcr references the last byte of program clock reference base
00746             if (ts->mux_rate > 1)
00747                 pcr = get_pcr(ts, s->pb);
00748             else
00749                 pcr = (dts - delay)*300;
00750             if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
00751                 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
00752             *q++ = 7; /* AFC length */
00753             *q++ = 0x10; /* flags: PCR present */
00754             q = write_pcr_bits(q, pcr);
00755         }
00756         if (is_start) {
00757             int pes_extension = 0;
00758             /* write PES header */
00759             *q++ = 0x00;
00760             *q++ = 0x00;
00761             *q++ = 0x01;
00762             private_code = 0;
00763             if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
00764                 if (st->codec->codec_id == CODEC_ID_DIRAC) {
00765                     *q++ = 0xfd;
00766                 } else
00767                     *q++ = 0xe0;
00768             } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
00769                        (st->codec->codec_id == CODEC_ID_MP2 ||
00770                         st->codec->codec_id == CODEC_ID_MP3 ||
00771                         st->codec->codec_id == CODEC_ID_AAC)) {
00772                 *q++ = 0xc0;
00773             } else {
00774                 *q++ = 0xbd;
00775                 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
00776                     private_code = 0x20;
00777                 }
00778             }
00779             header_len = 0;
00780             flags = 0;
00781             if (pts != AV_NOPTS_VALUE) {
00782                 header_len += 5;
00783                 flags |= 0x80;
00784             }
00785             if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
00786                 header_len += 5;
00787                 flags |= 0x40;
00788             }
00789             if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
00790                 st->codec->codec_id == CODEC_ID_DIRAC) {
00791                 /* set PES_extension_flag */
00792                 pes_extension = 1;
00793                 flags |= 0x01;
00794 
00795                 /*
00796                 * One byte for PES2 extension flag +
00797                 * one byte for extension length +
00798                 * one byte for extension id
00799                 */
00800                 header_len += 3;
00801             }
00802             len = payload_size + header_len + 3;
00803             if (private_code != 0)
00804                 len++;
00805             if (len > 0xffff)
00806                 len = 0;
00807             *q++ = len >> 8;
00808             *q++ = len;
00809             val = 0x80;
00810             /* data alignment indicator is required for subtitle data */
00811             if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
00812                 val |= 0x04;
00813             *q++ = val;
00814             *q++ = flags;
00815             *q++ = header_len;
00816             if (pts != AV_NOPTS_VALUE) {
00817                 write_pts(q, flags >> 6, pts);
00818                 q += 5;
00819             }
00820             if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
00821                 write_pts(q, 1, dts);
00822                 q += 5;
00823             }
00824             if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) {
00825                 flags = 0x01;  /* set PES_extension_flag_2 */
00826                 *q++ = flags;
00827                 *q++ = 0x80 | 0x01;  /* marker bit + extension length */
00828                 /*
00829                 * Set the stream id extension flag bit to 0 and
00830                 * write the extended stream id
00831                 */
00832                 *q++ = 0x00 | 0x60;
00833             }
00834             if (private_code != 0)
00835                 *q++ = private_code;
00836             is_start = 0;
00837         }
00838         /* header size */
00839         header_len = q - buf;
00840         /* data len */
00841         len = TS_PACKET_SIZE - header_len;
00842         if (len > payload_size)
00843             len = payload_size;
00844         stuffing_len = TS_PACKET_SIZE - header_len - len;
00845         if (stuffing_len > 0) {
00846             /* add stuffing with AFC */
00847             if (buf[3] & 0x20) {
00848                 /* stuffing already present: increase its size */
00849                 afc_len = buf[4] + 1;
00850                 memmove(buf + 4 + afc_len + stuffing_len,
00851                         buf + 4 + afc_len,
00852                         header_len - (4 + afc_len));
00853                 buf[4] += stuffing_len;
00854                 memset(buf + 4 + afc_len, 0xff, stuffing_len);
00855             } else {
00856                 /* add stuffing */
00857                 memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4);
00858                 buf[3] |= 0x20;
00859                 buf[4] = stuffing_len - 1;
00860                 if (stuffing_len >= 2) {
00861                     buf[5] = 0x00;
00862                     memset(buf + 6, 0xff, stuffing_len - 2);
00863                 }
00864             }
00865         }
00866         memcpy(buf + TS_PACKET_SIZE - len, payload, len);
00867         payload += len;
00868         payload_size -= len;
00869         avio_write(s->pb, buf, TS_PACKET_SIZE);
00870     }
00871     avio_flush(s->pb);
00872 }
00873 
00874 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
00875 {
00876     AVStream *st = s->streams[pkt->stream_index];
00877     int size = pkt->size;
00878     uint8_t *buf= pkt->data;
00879     uint8_t *data= NULL;
00880     MpegTSWriteStream *ts_st = st->priv_data;
00881     const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2;
00882     int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;
00883 
00884     if (pkt->pts != AV_NOPTS_VALUE)
00885         pts = pkt->pts + delay;
00886     if (pkt->dts != AV_NOPTS_VALUE)
00887         dts = pkt->dts + delay;
00888 
00889     if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
00890         av_log(s, AV_LOG_ERROR, "first pts value must set\n");
00891         return -1;
00892     }
00893     ts_st->first_pts_check = 0;
00894 
00895     if (st->codec->codec_id == CODEC_ID_H264) {
00896         const uint8_t *p = buf, *buf_end = p+size;
00897         uint32_t state = -1;
00898 
00899         if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
00900             av_log(s, AV_LOG_ERROR, "h264 bitstream malformated, "
00901                    "no startcode found, use -vbsf h264_mp4toannexb\n");
00902             return -1;
00903         }
00904 
00905         do {
00906             p = ff_find_start_code(p, buf_end, &state);
00907             //av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f);
00908         } while (p < buf_end && (state & 0x1f) != 9 &&
00909                  (state & 0x1f) != 5 && (state & 0x1f) != 1);
00910 
00911         if ((state & 0x1f) != 9) { // AUD NAL
00912             data = av_malloc(pkt->size+6);
00913             if (!data)
00914                 return -1;
00915             memcpy(data+6, pkt->data, pkt->size);
00916             AV_WB32(data, 0x00000001);
00917             data[4] = 0x09;
00918             data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
00919             buf  = data;
00920             size = pkt->size+6;
00921         }
00922     } else if (st->codec->codec_id == CODEC_ID_AAC) {
00923         if (pkt->size < 2)
00924             return -1;
00925         if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
00926             ADTSContext *adts = ts_st->adts;
00927             int new_size;
00928             if (!adts) {
00929                 av_log(s, AV_LOG_ERROR, "aac bitstream not in adts format "
00930                        "and extradata missing\n");
00931                 return -1;
00932             }
00933             new_size = ADTS_HEADER_SIZE+adts->pce_size+pkt->size;
00934             if ((unsigned)new_size >= INT_MAX)
00935                 return -1;
00936             data = av_malloc(new_size);
00937             if (!data)
00938                 return AVERROR(ENOMEM);
00939             ff_adts_write_frame_header(adts, data, pkt->size, adts->pce_size);
00940             if (adts->pce_size) {
00941                 memcpy(data+ADTS_HEADER_SIZE, adts->pce_data, adts->pce_size);
00942                 adts->pce_size = 0;
00943             }
00944             memcpy(data+ADTS_HEADER_SIZE+adts->pce_size, pkt->data, pkt->size);
00945             buf = data;
00946             size = new_size;
00947         }
00948     }
00949 
00950     if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
00951         // for video and subtitle, write a single pes packet
00952         mpegts_write_pes(s, st, buf, size, pts, dts);
00953         av_free(data);
00954         return 0;
00955     }
00956 
00957     if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
00958         mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
00959                          ts_st->payload_pts, ts_st->payload_dts);
00960         ts_st->payload_index = 0;
00961     }
00962 
00963     if (!ts_st->payload_index) {
00964         ts_st->payload_pts = pts;
00965         ts_st->payload_dts = dts;
00966     }
00967 
00968     memcpy(ts_st->payload + ts_st->payload_index, buf, size);
00969     ts_st->payload_index += size;
00970 
00971     av_free(data);
00972 
00973     return 0;
00974 }
00975 
00976 static int mpegts_write_end(AVFormatContext *s)
00977 {
00978     MpegTSWrite *ts = s->priv_data;
00979     MpegTSWriteStream *ts_st;
00980     MpegTSService *service;
00981     AVStream *st;
00982     int i;
00983 
00984     /* flush current packets */
00985     for(i = 0; i < s->nb_streams; i++) {
00986         st = s->streams[i];
00987         ts_st = st->priv_data;
00988         if (ts_st->payload_index > 0) {
00989             mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
00990                              ts_st->payload_pts, ts_st->payload_dts);
00991         }
00992         av_freep(&ts_st->adts);
00993     }
00994     avio_flush(s->pb);
00995 
00996     for(i = 0; i < ts->nb_services; i++) {
00997         service = ts->services[i];
00998         av_freep(&service->provider_name);
00999         av_freep(&service->name);
01000         av_free(service);
01001     }
01002     av_free(ts->services);
01003 
01004     return 0;
01005 }
01006 
01007 AVOutputFormat ff_mpegts_muxer = {
01008     "mpegts",
01009     NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
01010     "video/x-mpegts",
01011     "ts,m2t",
01012     sizeof(MpegTSWrite),
01013     CODEC_ID_MP2,
01014     CODEC_ID_MPEG2VIDEO,
01015     mpegts_write_header,
01016     mpegts_write_packet,
01017     mpegts_write_end,
01018     .priv_class = &mpegts_muxer_class,
01019 };