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.

589 lines
13KB

  1. /*
  2. * "NUT" Container Format muxer and demuxer (DRAFT-20031003)
  3. * Copyright (c) 2003 Alex Beregszaszi
  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 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. * NUT DRAFT can be found in MPlayer CVS at DOCS/tech/mpcf.txt
  20. *
  21. * AND http://people.fsn.hu/~alex/nut/ (TeX, pdf, ps, dvi, ..)
  22. *
  23. */
  24. /*
  25. * TODO:
  26. * - checksumming
  27. * - optimal timestamp handling
  28. * - index writing
  29. * - info and index packet reading support
  30. * - startcode searching for broken streams
  31. * - subpacket support
  32. */
  33. //#define DEBUG 1
  34. #include "avformat.h"
  35. #include "mpegaudio.h"
  36. #include "avi.h"
  37. //from /dev/random
  38. #define MAIN_STARTCODE (0xF9526A6200000000ULL + ('N'<<24) + ('U'<<16) + ('T'<<8) + 'M')
  39. #define STREAM_STARTCODE (0xD667773F00000000ULL + ('N'<<24) + ('U'<<16) + ('T'<<8) + 'S')
  40. #define KEYFRAME_STARTCODE (0xCB86308700000000ULL + ('N'<<24) + ('U'<<16) + ('T'<<8) + 'K')
  41. #define INDEX_STARTCODE (0xEBFCDE0E00000000ULL + ('N'<<24) + ('U'<<16) + ('T'<<8) + 'X')
  42. #define INFO_STARTCODE (0xA37B643500000000ULL + ('N'<<24) + ('U'<<16) + ('T'<<8) + 'I')
  43. typedef struct {
  44. int curr_frame_start;
  45. int last_frame_size;
  46. int curr_frame_size;
  47. } NUTContext;
  48. static int bytes_left(ByteIOContext *bc)
  49. {
  50. return bc->buf_end - bc->buf_ptr;
  51. }
  52. static uint64_t get_v(ByteIOContext *bc)
  53. {
  54. uint64_t val = 0;
  55. for(; bytes_left(bc) > 0; )
  56. {
  57. int tmp = get_byte(bc);
  58. if (tmp&0x80)
  59. val= (val<<7) + tmp - 0x80;
  60. else
  61. return (val<<7) + tmp;
  62. }
  63. return -1;
  64. }
  65. static int64_t get_s(ByteIOContext *bc)
  66. {
  67. int64_t v = get_v(bc) + 1;
  68. if (v&1)
  69. return -(v>>1);
  70. else
  71. return (v>>1);
  72. }
  73. static int get_b(ByteIOContext *bc, char *data, int maxlen)
  74. {
  75. int i, len;
  76. len = get_v(bc);
  77. for (i = 0; i < len && i < maxlen; i++)
  78. data[i] = get_byte(bc);
  79. /* skip remaining bytes */
  80. url_fskip(bc, len-i);
  81. return 0;
  82. }
  83. static int get_bi(ByteIOContext *bc)
  84. {
  85. int i, len, val = 0;
  86. len = get_v(bc);
  87. for (i = 0; i < len && i <= 4; i++)
  88. val |= get_byte(bc) << (i * 8);
  89. /* skip remaining bytes */
  90. url_fskip(bc, len-i);
  91. return val;
  92. }
  93. static int get_packetheader(NUTContext *nut, ByteIOContext *bc)
  94. {
  95. nut->curr_frame_start = url_ftell(bc);
  96. nut->curr_frame_size = get_v(bc);
  97. nut->last_frame_size = get_v(bc);
  98. dprintf("Packet: fwd: %d bwd: %d\n",
  99. nut->curr_frame_size, nut->last_frame_size);
  100. return 0;
  101. }
  102. /**
  103. *
  104. */
  105. static int get_length(uint64_t val){
  106. int i;
  107. for (i=7; ; i+=7)
  108. if ((val>>i) == 0)
  109. return i;
  110. return 7; //not reached
  111. }
  112. static int put_v(ByteIOContext *bc, uint64_t val)
  113. {
  114. int i;
  115. // if (bytes_left(s)*8 < 9)
  116. // return -1;
  117. if (bytes_left(bc) < 1)
  118. return -1;
  119. val &= 0x7FFFFFFFFFFFFFFFULL; // FIXME can only encode upto 63 bits currently
  120. i= get_length(val);
  121. for (i-=7; i>0; i-=7){
  122. put_byte(bc, 0x80 | (val>>i));
  123. }
  124. put_byte(bc, val&0x7f);
  125. return 0;
  126. }
  127. static int put_s(ByteIOContext *bc, uint64_t val)
  128. {
  129. if (val<=0)
  130. return put_v(bc, -2*val);
  131. else
  132. return put_v(bc, 2*val-1);
  133. }
  134. static int put_b(ByteIOContext *bc, char *data, int len)
  135. {
  136. int i;
  137. put_v(bc, len);
  138. for (i = 0; i < len; i++)
  139. put_byte(bc, data[i]);
  140. return 0;
  141. }
  142. static int put_bi(ByteIOContext *bc, int val)
  143. {
  144. put_v(bc, 4);
  145. put_le32(bc, val);
  146. return 0;
  147. }
  148. static int put_packetheader(NUTContext *nut, ByteIOContext *bc, int max_size)
  149. {
  150. put_flush_packet(bc);
  151. nut->curr_frame_start = url_ftell(bc);
  152. nut->curr_frame_size = max_size;
  153. /* packet header */
  154. put_v(bc, nut->curr_frame_size); /* forward ptr */
  155. put_v(bc, nut->last_frame_size); /* backward ptr */
  156. dprintf("Packet: fwd: %d, bwd: %d\n",
  157. nut->curr_frame_size, nut->last_frame_size);
  158. nut->last_frame_size = nut->curr_frame_size;
  159. return 0;
  160. }
  161. static int update_packetheader(NUTContext *nut, ByteIOContext *bc, int additional_size){
  162. offset_t start= nut->curr_frame_start;
  163. offset_t cur= url_ftell(bc);
  164. int size= cur - start + additional_size;
  165. assert( size <= nut->curr_frame_size );
  166. url_fseek(bc, start, SEEK_SET);
  167. put_v(bc, size);
  168. if(get_length(size) < get_length(nut->curr_frame_size))
  169. put_byte(bc, 0x80);
  170. nut->curr_frame_size= size;
  171. dprintf("Packet update: size: %d\n", size);
  172. url_fseek(bc, cur, SEEK_SET);
  173. return 0;
  174. }
  175. static int nut_write_header(AVFormatContext *s)
  176. {
  177. NUTContext *nut = s->priv_data;
  178. ByteIOContext *bc = &s->pb;
  179. AVCodecContext *codec;
  180. int i;
  181. /* main header */
  182. put_be64(bc, MAIN_STARTCODE);
  183. put_packetheader(nut, bc, 120);
  184. put_v(bc, 0); /* version */
  185. put_v(bc, s->nb_streams);
  186. put_be32(bc, 0); /* FIXME: checksum */
  187. update_packetheader(nut, bc, 0);
  188. /* stream headers */
  189. for (i = 0; i < s->nb_streams; i++)
  190. {
  191. int nom, denom;
  192. codec = &s->streams[i]->codec;
  193. put_be64(bc, STREAM_STARTCODE);
  194. put_packetheader(nut, bc, 120);
  195. put_v(bc, i /*s->streams[i]->index*/);
  196. put_v(bc, (codec->codec_type == CODEC_TYPE_AUDIO) ? 32 : 0);
  197. if (codec->codec_tag)
  198. put_bi(bc, codec->codec_tag);
  199. else if (codec->codec_type == CODEC_TYPE_VIDEO)
  200. {
  201. int tmp = codec_get_bmp_tag(codec->codec_id);
  202. put_bi(bc, tmp);
  203. nom = codec->frame_rate;
  204. denom = codec->frame_rate_base;
  205. }
  206. else if (codec->codec_type == CODEC_TYPE_AUDIO)
  207. {
  208. int tmp = codec_get_wav_tag(codec->codec_id);
  209. put_bi(bc, tmp);
  210. nom = codec->sample_rate/8;
  211. denom = 8;
  212. }
  213. put_v(bc, codec->bit_rate);
  214. put_v(bc, 0); /* no language code */
  215. put_v(bc, nom);
  216. put_v(bc, denom);
  217. put_v(bc, 0); /* msb timestamp_shift */
  218. put_v(bc, 0); /* shuffle type */
  219. put_byte(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */
  220. put_v(bc, 0); /* no codec specific headers */
  221. switch(codec->codec_type)
  222. {
  223. case CODEC_TYPE_AUDIO:
  224. put_v(bc, (codec->sample_rate * denom) / nom);
  225. put_v(bc, codec->channels);
  226. put_be32(bc, 0); /* FIXME: checksum */
  227. break;
  228. case CODEC_TYPE_VIDEO:
  229. put_v(bc, codec->width);
  230. put_v(bc, codec->height);
  231. put_v(bc, 0); /* aspected w */
  232. put_v(bc, 0); /* aspected h */
  233. put_v(bc, 0); /* csp type -- unknown */
  234. put_be32(bc, 0); /* FIXME: checksum */
  235. break;
  236. default:
  237. break;
  238. }
  239. update_packetheader(nut, bc, 0);
  240. }
  241. #if 0
  242. /* info header */
  243. put_be64(bc, INFO_STARTCODE);
  244. put_packetheader(nut, bc, 16+strlen(s->author)+strlen(s->title)+
  245. strlen(s->comment)+strlen(s->copyright));
  246. if (s->author[0])
  247. {
  248. put_v(bc, 5); /* type */
  249. put_b(bc, s->author, strlen(s->author));
  250. }
  251. if (s->title[0])
  252. {
  253. put_v(bc, 6); /* type */
  254. put_b(bc, s->title, strlen(s->title));
  255. }
  256. if (s->comment[0])
  257. {
  258. put_v(bc, 7); /* type */
  259. put_b(bc, s->comment, strlen(s->comment));
  260. }
  261. if (s->copyright[0])
  262. {
  263. put_v(bc, 8); /* type */
  264. put_b(bc, s->copyright, strlen(s->copyright));
  265. }
  266. /* encoder */
  267. put_v(bc, 9); /* type */
  268. put_b(bc, LIBAVFORMAT_IDENT "\0", strlen(LIBAVFORMAT_IDENT));
  269. put_v(bc, 0); /* eof info */
  270. put_be32(bc, 0); /* FIXME: checksum */
  271. update_packetheader(nut, bc, 0);
  272. #endif
  273. put_flush_packet(bc);
  274. return 0;
  275. }
  276. static int nut_write_packet(AVFormatContext *s, int stream_index,
  277. const uint8_t *buf, int size, int64_t pts)
  278. {
  279. NUTContext *nut = s->priv_data;
  280. ByteIOContext *bc = &s->pb;
  281. int key_frame = 0;
  282. int flags;
  283. AVCodecContext *enc;
  284. if (stream_index > s->nb_streams)
  285. return 1;
  286. enc = &s->streams[stream_index]->codec;
  287. key_frame = enc->coded_frame->key_frame;
  288. if (key_frame)
  289. put_be64(bc, KEYFRAME_STARTCODE);
  290. flags=0;
  291. flags<<=2; flags|=1; //priority
  292. flags<<=1; flags|=0; //checksum
  293. flags<<=1; flags|=0; //msb_timestamp_flag
  294. flags<<=2; flags|=1; //subpacket_type
  295. flags<<=1; flags|=0; //reserved
  296. put_byte(bc, flags);
  297. put_packetheader(nut, bc, size+20);
  298. put_v(bc, stream_index);
  299. put_s(bc, pts); /* lsb_timestamp */
  300. update_packetheader(nut, bc, size);
  301. put_buffer(bc, buf, size);
  302. put_flush_packet(bc);
  303. return 0;
  304. }
  305. static int nut_write_trailer(AVFormatContext *s)
  306. {
  307. ByteIOContext *bc = &s->pb;
  308. #if 0
  309. int i;
  310. /* WRITE INDEX */
  311. for (i = 0; s->nb_streams; i++)
  312. {
  313. put_be64(bc, INDEX_STARTCODE);
  314. put_packetheader(nut, bc, 64);
  315. put_v(bc, s->streams[i]->id);
  316. put_v(bc, ...);
  317. put_be32(bc, 0); /* FIXME: checksum */
  318. update_packetheader(nut, bc, 0);
  319. }
  320. #endif
  321. put_flush_packet(bc);
  322. return 0;
  323. }
  324. static int nut_probe(AVProbeData *p)
  325. {
  326. int i;
  327. uint64_t code;
  328. code = 0xff;
  329. for (i = 0; i < p->buf_size; i++) {
  330. int c = p->buf[i];
  331. code = (code << 8) | c;
  332. if (code == MAIN_STARTCODE)
  333. return AVPROBE_SCORE_MAX;
  334. }
  335. return 0;
  336. }
  337. static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
  338. {
  339. NUTContext *nut = s->priv_data;
  340. ByteIOContext *bc = &s->pb;
  341. uint64_t tmp;
  342. int cur_stream, nb_streams;
  343. /* main header */
  344. tmp = get_be64(bc);
  345. if (tmp != MAIN_STARTCODE)
  346. fprintf(stderr, "damaged? startcode!=1 (%Ld)\n", tmp);
  347. get_packetheader(nut, bc);
  348. tmp = get_v(bc);
  349. if (tmp != 0)
  350. fprintf(stderr, "bad version (%Ld)\n", tmp);
  351. nb_streams = get_v(bc);
  352. get_be32(bc); /* checkusm */
  353. s->bit_rate = 0;
  354. /* stream header */
  355. for (cur_stream = 0; cur_stream < nb_streams; cur_stream++)
  356. {
  357. int class, nom, denom;
  358. AVStream *st;
  359. tmp = get_be64(bc);
  360. if (tmp != STREAM_STARTCODE)
  361. fprintf(stderr, "damaged? startcode!=1 (%Ld)\n", tmp);
  362. get_packetheader(nut, bc);
  363. st = av_new_stream(s, get_v(bc));
  364. if (!st)
  365. return AVERROR_NOMEM;
  366. class = get_v(bc);
  367. tmp = get_bi(bc);
  368. switch(class)
  369. {
  370. case 0:
  371. st->codec.codec_type = CODEC_TYPE_VIDEO;
  372. st->codec.codec_id = codec_get_bmp_id(tmp);
  373. if (st->codec.codec_id == CODEC_ID_NONE)
  374. fprintf(stderr, "Unknown codec?!\n");
  375. break;
  376. case 32:
  377. st->codec.codec_type = CODEC_TYPE_AUDIO;
  378. st->codec.codec_id = codec_get_wav_id(tmp);
  379. if (st->codec.codec_id == CODEC_ID_NONE)
  380. fprintf(stderr, "Unknown codec?!\n");
  381. break;
  382. default:
  383. fprintf(stderr, "Unknown stream class (%d)\n", class);
  384. return -1;
  385. }
  386. s->bit_rate += get_v(bc);
  387. get_b(bc, NULL, 0); /* language code */
  388. nom = get_v(bc);
  389. denom = get_v(bc);
  390. get_v(bc); /* FIXME: msb timestamp base */
  391. get_v(bc); /* shuffle type */
  392. get_byte(bc); /* flags */
  393. /* codec specific data headers */
  394. while(get_v(bc) != 0)
  395. url_fskip(bc, get_v(bc));
  396. if (class == 0) /* VIDEO */
  397. {
  398. st->codec.width = get_v(bc);
  399. st->codec.height = get_v(bc);
  400. get_v(bc); /* aspected w */
  401. get_v(bc); /* aspected h */
  402. get_v(bc); /* csp type */
  403. get_be32(bc); /* checksum */
  404. st->codec.frame_rate = nom;
  405. st->codec.frame_rate_base = denom;
  406. }
  407. if (class == 32) /* AUDIO */
  408. {
  409. st->codec.sample_rate = (get_v(bc) * nom) / denom;
  410. st->codec.channels = get_v(bc);
  411. get_be32(bc); /* checksum */
  412. }
  413. }
  414. return 0;
  415. }
  416. static int nut_read_packet(AVFormatContext *s, AVPacket *pkt)
  417. {
  418. NUTContext *nut = s->priv_data;
  419. ByteIOContext *bc = &s->pb;
  420. int id, timestamp, size;
  421. int key_frame = 0;
  422. uint64_t tmp;
  423. if (url_feof(bc))
  424. return -1;
  425. tmp = get_byte(bc);
  426. if (tmp & 0x80) /* zero bit set? */
  427. {
  428. tmp<<=8 ; tmp |= get_byte(bc);
  429. tmp<<=16; tmp |= get_be16(bc);
  430. tmp<<=32; tmp |= get_be32(bc);
  431. if (tmp == KEYFRAME_STARTCODE)
  432. {
  433. key_frame = 1;
  434. tmp = get_byte(bc); /* flags */
  435. }
  436. else
  437. fprintf(stderr, "error in zero bit / startcode %LX\n", tmp);
  438. }
  439. get_packetheader(nut, bc);
  440. #if 0
  441. if (((tmp & 0x60)>>5) > 3) /* priority <= 3 */
  442. fprintf(stderr, "sanity check failed!\n");
  443. #endif
  444. id = get_v(bc);
  445. timestamp = get_s(bc);
  446. size = (nut->curr_frame_size - (url_ftell(bc)-nut->curr_frame_start));
  447. dprintf("flags: 0x%Lx, timestamp: %d, packet size: %d\n", tmp, timestamp, size);
  448. if (size < 0)
  449. return -1;
  450. av_new_packet(pkt, size);
  451. get_buffer(bc, pkt->data, size);
  452. pkt->stream_index = id;
  453. if (key_frame)
  454. pkt->flags |= PKT_FLAG_KEY;
  455. pkt->pts = timestamp;
  456. return 0;
  457. }
  458. static AVInputFormat nut_iformat = {
  459. "nut",
  460. "nut format",
  461. sizeof(NUTContext),
  462. nut_probe,
  463. nut_read_header,
  464. nut_read_packet,
  465. // nut_read_close,
  466. // nut_read_seek,
  467. .extensions = "nut",
  468. };
  469. static AVOutputFormat nut_oformat = {
  470. "nut",
  471. "nut format",
  472. "video/x-nut",
  473. "nut",
  474. sizeof(NUTContext),
  475. #ifdef CONFIG_VORBIS
  476. CODEC_ID_VORBIS,
  477. #elif defined(CONFIG_MP3LAME)
  478. CODEC_ID_MP3,
  479. #else
  480. CODEC_ID_MP2, /* AC3 needs liba52 decoder */
  481. #endif
  482. CODEC_ID_MPEG4,
  483. nut_write_header,
  484. nut_write_packet,
  485. nut_write_trailer,
  486. };
  487. int nut_init(void)
  488. {
  489. av_register_input_format(&nut_iformat);
  490. av_register_output_format(&nut_oformat);
  491. return 0;
  492. }