You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

317 lines
9.6KB

  1. /*
  2. * MPEG2 transport stream (aka DVB) demux
  3. * Copyright (c) 2002 Fabrice Bellard.
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 2 of the License, or (at your option) any later version.
  9. *
  10. * This library is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public
  16. * License along with this library; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. */
  19. #include "avformat.h"
  20. #define TS_FEC_PACKET_SIZE 204
  21. #define TS_PACKET_SIZE 188
  22. #define NB_PID_MAX 8192
  23. enum MpegTSState {
  24. MPEGTS_HEADER = 0,
  25. MPEGTS_PESHEADER_FILL,
  26. MPEGTS_PESHEADER_FLAGS,
  27. MPEGTS_PESHEADER_SIZE,
  28. MPEGTS_PESHEADER_READ,
  29. MPEGTS_PAYLOAD,
  30. MPEGTS_SKIP,
  31. };
  32. /* enough for PES header + length */
  33. #define MAX_HEADER_SIZE 6
  34. typedef struct MpegTSStream {
  35. int pid;
  36. enum MpegTSState state;
  37. int last_cc; /* last cc code (-1 if first packet) */
  38. /* used to get the format */
  39. int header_size;
  40. int payload_size;
  41. int pes_header_size;
  42. AVStream *st;
  43. unsigned char header[MAX_HEADER_SIZE];
  44. } MpegTSStream;
  45. typedef struct MpegTSContext {
  46. int raw_packet_size; /* raw packet size, including FEC if present */
  47. MpegTSStream *pids[NB_PID_MAX];
  48. } MpegTSContext;
  49. /* autodetect fec presence. Must have at least 1024 bytes */
  50. static int get_packet_size(const unsigned char *buf, int size)
  51. {
  52. int i;
  53. if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
  54. return -1;
  55. for(i=0;i<5;i++) {
  56. if (buf[i * TS_PACKET_SIZE] != 0x47)
  57. goto try_fec;
  58. }
  59. return TS_PACKET_SIZE;
  60. try_fec:
  61. for(i=0;i<5;i++) {
  62. if (buf[i * TS_FEC_PACKET_SIZE] != 0x47)
  63. return -1;
  64. }
  65. return TS_FEC_PACKET_SIZE;
  66. }
  67. static int mpegts_probe(AVProbeData *p)
  68. {
  69. int size;
  70. size = get_packet_size(p->buf, p->buf_size);
  71. if (size < 0)
  72. return 0;
  73. return AVPROBE_SCORE_MAX;
  74. }
  75. static int mpegts_read_header(AVFormatContext *s,
  76. AVFormatParameters *ap)
  77. {
  78. MpegTSContext *ts = s->priv_data;
  79. ByteIOContext *pb = &s->pb;
  80. unsigned char buf[1024];
  81. int len;
  82. INT64 pos;
  83. /* read the first 1024 bytes to get packet size */
  84. pos = url_ftell(pb);
  85. len = get_buffer(pb, buf, sizeof(buf));
  86. if (len != sizeof(buf))
  87. goto fail;
  88. ts->raw_packet_size = get_packet_size(buf, sizeof(buf));
  89. if (ts->raw_packet_size <= 0)
  90. goto fail;
  91. /* go again to the start */
  92. url_fseek(pb, pos, SEEK_SET);
  93. return 0;
  94. fail:
  95. return -1;
  96. }
  97. /* return non zero if a packet could be constructed */
  98. static int mpegts_push_data(AVFormatContext *s, MpegTSStream *tss,
  99. AVPacket *pkt,
  100. const unsigned char *buf, int buf_size, int is_start)
  101. {
  102. AVStream *st;
  103. const unsigned char *p;
  104. int len, code, codec_type, codec_id;
  105. if (is_start) {
  106. tss->state = MPEGTS_HEADER;
  107. tss->header_size = 0;
  108. }
  109. p = buf;
  110. while (buf_size > 0) {
  111. len = buf_size;
  112. switch(tss->state) {
  113. case MPEGTS_HEADER:
  114. if (len > MAX_HEADER_SIZE - tss->header_size)
  115. len = MAX_HEADER_SIZE - tss->header_size;
  116. memcpy(tss->header, p, len);
  117. tss->header_size += len;
  118. p += len;
  119. buf_size -= len;
  120. if (tss->header_size == MAX_HEADER_SIZE) {
  121. /* we got all the PES or section header. We can now
  122. decide */
  123. #if 0
  124. av_hex_dump(tss->header, tss->header_size);
  125. #endif
  126. if (tss->header[0] == 0x00 && tss->header[1] == 0x00 &&
  127. tss->header[2] == 0x01) {
  128. /* it must be an mpeg2 PES stream */
  129. /* XXX: add AC3 support */
  130. code = tss->header[3] | 0x100;
  131. if (!((code >= 0x1c0 && code <= 0x1df) ||
  132. (code >= 0x1e0 && code <= 0x1ef)))
  133. goto skip;
  134. if (!tss->st) {
  135. /* allocate stream */
  136. if (code >= 0x1c0 && code <= 0x1df) {
  137. codec_type = CODEC_TYPE_AUDIO;
  138. codec_id = CODEC_ID_MP2;
  139. } else {
  140. codec_type = CODEC_TYPE_VIDEO;
  141. codec_id = CODEC_ID_MPEG1VIDEO;
  142. }
  143. st = av_new_stream(s, tss->pid);
  144. if (st) {
  145. st->priv_data = tss;
  146. st->codec.codec_type = codec_type;
  147. st->codec.codec_id = codec_id;
  148. tss->st = st;
  149. }
  150. }
  151. tss->state = MPEGTS_PESHEADER_FILL;
  152. tss->payload_size = (tss->header[4] << 8) | tss->header[5];
  153. if (tss->payload_size == 0)
  154. tss->payload_size = 65536;
  155. } else {
  156. /* otherwise, it should be a table */
  157. /* skip packet */
  158. skip:
  159. tss->state = MPEGTS_SKIP;
  160. continue;
  161. }
  162. }
  163. break;
  164. /**********************************************/
  165. /* PES packing parsing */
  166. case MPEGTS_PESHEADER_FILL:
  167. /* skip filling */
  168. code = *p++;
  169. buf_size--;
  170. tss->payload_size--;
  171. if (code != 0xff) {
  172. if ((code & 0xc0) != 0x80)
  173. goto skip;
  174. tss->state = MPEGTS_PESHEADER_FLAGS;
  175. }
  176. break;
  177. case MPEGTS_PESHEADER_FLAGS:
  178. code = *p++;
  179. buf_size--;
  180. tss->payload_size--;
  181. tss->state = MPEGTS_PESHEADER_SIZE;
  182. break;
  183. case MPEGTS_PESHEADER_SIZE:
  184. tss->pes_header_size = *p++;
  185. buf_size--;
  186. tss->payload_size--;
  187. tss->state = MPEGTS_PESHEADER_READ;
  188. break;
  189. case MPEGTS_PESHEADER_READ:
  190. /* currently we do nothing except skipping */
  191. if (len > tss->pes_header_size)
  192. len = tss->pes_header_size;
  193. p += len;
  194. buf_size -= len;
  195. tss->pes_header_size -= len;
  196. tss->payload_size -= len;
  197. if (tss->pes_header_size == 0)
  198. tss->state = MPEGTS_PAYLOAD;
  199. break;
  200. case MPEGTS_PAYLOAD:
  201. if (len > tss->payload_size)
  202. len = tss->payload_size;
  203. if (len > 0) {
  204. if (tss->st && av_new_packet(pkt, buf_size) == 0) {
  205. memcpy(pkt->data, p, buf_size);
  206. pkt->stream_index = tss->st->index;
  207. return 1;
  208. }
  209. tss->payload_size -= len;
  210. }
  211. buf_size = 0;
  212. break;
  213. case MPEGTS_SKIP:
  214. buf_size = 0;
  215. break;
  216. }
  217. }
  218. return 0;
  219. }
  220. static int mpegts_read_packet(AVFormatContext *s,
  221. AVPacket *pkt)
  222. {
  223. MpegTSContext *ts = s->priv_data;
  224. MpegTSStream *tss;
  225. ByteIOContext *pb = &s->pb;
  226. unsigned char packet[TS_FEC_PACKET_SIZE];
  227. int len, pid, cc, cc_ok, afc;
  228. const unsigned char *p;
  229. for(;;) {
  230. len = get_buffer(pb, packet, ts->raw_packet_size);
  231. if (len != ts->raw_packet_size)
  232. return AVERROR_IO;
  233. /* check paquet sync byte */
  234. /* XXX: accept to resync ? */
  235. if (packet[0] != 0x47)
  236. return AVERROR_INVALIDDATA;
  237. pid = ((packet[1] & 0x1f) << 8) | packet[2];
  238. tss = ts->pids[pid];
  239. if (tss == NULL) {
  240. /* if no pid found, then add a pid context */
  241. tss = av_mallocz(sizeof(MpegTSStream));
  242. if (!tss)
  243. continue;
  244. ts->pids[pid] = tss;
  245. tss->pid = pid;
  246. tss->last_cc = -1;
  247. // printf("new pid=0x%x\n", pid);
  248. }
  249. /* continuity check (currently not used) */
  250. cc = (packet[3] & 0xf);
  251. cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc));
  252. tss->last_cc = cc;
  253. /* skip adaptation field */
  254. afc = (packet[3] >> 4) & 3;
  255. p = packet + 4;
  256. if (afc == 0) /* reserved value */
  257. continue;
  258. if (afc == 2) /* adaptation field only */
  259. continue;
  260. if (afc == 3) {
  261. /* skip adapation field */
  262. p += p[0] + 1;
  263. }
  264. /* if past the end of packet, ignore */
  265. if (p >= packet + TS_PACKET_SIZE)
  266. continue;
  267. if (mpegts_push_data(s, tss, pkt, p, TS_PACKET_SIZE - (p - packet),
  268. packet[1] & 0x40))
  269. break;
  270. }
  271. return 0;
  272. }
  273. static int mpegts_read_close(AVFormatContext *s)
  274. {
  275. MpegTSContext *ts = s->priv_data;
  276. int i;
  277. for(i=0;i<NB_PID_MAX;i++)
  278. av_free(ts->pids[i]);
  279. return 0;
  280. }
  281. AVInputFormat mpegts_demux = {
  282. "mpegts",
  283. "MPEG2 transport stream format",
  284. sizeof(MpegTSContext),
  285. mpegts_probe,
  286. mpegts_read_header,
  287. mpegts_read_packet,
  288. mpegts_read_close,
  289. .flags = AVFMT_NOHEADER | AVFMT_SHOW_IDS,
  290. };
  291. int mpegts_init(void)
  292. {
  293. av_register_input_format(&mpegts_demux);
  294. return 0;
  295. }