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.

595 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. #ifdef CONFIG_ENCODERS
  113. static int put_v(ByteIOContext *bc, uint64_t val)
  114. {
  115. int i;
  116. // if (bytes_left(s)*8 < 9)
  117. // return -1;
  118. if (bytes_left(bc) < 1)
  119. return -1;
  120. val &= 0x7FFFFFFFFFFFFFFFULL; // FIXME can only encode upto 63 bits currently
  121. i= get_length(val);
  122. for (i-=7; i>0; i-=7){
  123. put_byte(bc, 0x80 | (val>>i));
  124. }
  125. put_byte(bc, val&0x7f);
  126. return 0;
  127. }
  128. static int put_s(ByteIOContext *bc, uint64_t val)
  129. {
  130. if (val<=0)
  131. return put_v(bc, -2*val);
  132. else
  133. return put_v(bc, 2*val-1);
  134. }
  135. static int put_b(ByteIOContext *bc, char *data, int len)
  136. {
  137. int i;
  138. put_v(bc, len);
  139. for (i = 0; i < len; i++)
  140. put_byte(bc, data[i]);
  141. return 0;
  142. }
  143. static int put_bi(ByteIOContext *bc, int val)
  144. {
  145. put_v(bc, 4);
  146. put_le32(bc, val);
  147. return 0;
  148. }
  149. static int put_packetheader(NUTContext *nut, ByteIOContext *bc, int max_size)
  150. {
  151. put_flush_packet(bc);
  152. nut->curr_frame_start = url_ftell(bc);
  153. nut->curr_frame_size = max_size;
  154. /* packet header */
  155. put_v(bc, nut->curr_frame_size); /* forward ptr */
  156. put_v(bc, nut->last_frame_size); /* backward ptr */
  157. dprintf("Packet: fwd: %d, bwd: %d\n",
  158. nut->curr_frame_size, nut->last_frame_size);
  159. nut->last_frame_size = nut->curr_frame_size;
  160. return 0;
  161. }
  162. static int update_packetheader(NUTContext *nut, ByteIOContext *bc, int additional_size){
  163. offset_t start= nut->curr_frame_start;
  164. offset_t cur= url_ftell(bc);
  165. int size= cur - start + additional_size;
  166. assert( size <= nut->curr_frame_size );
  167. url_fseek(bc, start, SEEK_SET);
  168. put_v(bc, size);
  169. if(get_length(size) < get_length(nut->curr_frame_size))
  170. put_byte(bc, 0x80);
  171. nut->curr_frame_size= size;
  172. dprintf("Packet update: size: %d\n", size);
  173. url_fseek(bc, cur, SEEK_SET);
  174. return 0;
  175. }
  176. static int nut_write_header(AVFormatContext *s)
  177. {
  178. NUTContext *nut = s->priv_data;
  179. ByteIOContext *bc = &s->pb;
  180. AVCodecContext *codec;
  181. int i;
  182. /* main header */
  183. put_be64(bc, MAIN_STARTCODE);
  184. put_packetheader(nut, bc, 120);
  185. put_v(bc, 0); /* version */
  186. put_v(bc, s->nb_streams);
  187. put_be32(bc, 0); /* FIXME: checksum */
  188. update_packetheader(nut, bc, 0);
  189. /* stream headers */
  190. for (i = 0; i < s->nb_streams; i++)
  191. {
  192. int nom, denom;
  193. codec = &s->streams[i]->codec;
  194. put_be64(bc, STREAM_STARTCODE);
  195. put_packetheader(nut, bc, 120);
  196. put_v(bc, i /*s->streams[i]->index*/);
  197. put_v(bc, (codec->codec_type == CODEC_TYPE_AUDIO) ? 32 : 0);
  198. if (codec->codec_tag)
  199. put_bi(bc, codec->codec_tag);
  200. else if (codec->codec_type == CODEC_TYPE_VIDEO)
  201. {
  202. int tmp = codec_get_bmp_tag(codec->codec_id);
  203. put_bi(bc, tmp);
  204. nom = codec->frame_rate;
  205. denom = codec->frame_rate_base;
  206. }
  207. else if (codec->codec_type == CODEC_TYPE_AUDIO)
  208. {
  209. int tmp = codec_get_wav_tag(codec->codec_id);
  210. put_bi(bc, tmp);
  211. nom = codec->sample_rate/8;
  212. denom = 8;
  213. }
  214. put_v(bc, codec->bit_rate);
  215. put_v(bc, 0); /* no language code */
  216. put_v(bc, nom);
  217. put_v(bc, denom);
  218. put_v(bc, 0); /* msb timestamp_shift */
  219. put_v(bc, 0); /* shuffle type */
  220. put_byte(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */
  221. put_v(bc, 0); /* no codec specific headers */
  222. switch(codec->codec_type)
  223. {
  224. case CODEC_TYPE_AUDIO:
  225. put_v(bc, (codec->sample_rate * denom) / nom);
  226. put_v(bc, codec->channels);
  227. put_be32(bc, 0); /* FIXME: checksum */
  228. break;
  229. case CODEC_TYPE_VIDEO:
  230. put_v(bc, codec->width);
  231. put_v(bc, codec->height);
  232. put_v(bc, 0); /* aspected w */
  233. put_v(bc, 0); /* aspected h */
  234. put_v(bc, 0); /* csp type -- unknown */
  235. put_be32(bc, 0); /* FIXME: checksum */
  236. break;
  237. default:
  238. break;
  239. }
  240. update_packetheader(nut, bc, 0);
  241. }
  242. #if 0
  243. /* info header */
  244. put_be64(bc, INFO_STARTCODE);
  245. put_packetheader(nut, bc, 16+strlen(s->author)+strlen(s->title)+
  246. strlen(s->comment)+strlen(s->copyright));
  247. if (s->author[0])
  248. {
  249. put_v(bc, 5); /* type */
  250. put_b(bc, s->author, strlen(s->author));
  251. }
  252. if (s->title[0])
  253. {
  254. put_v(bc, 6); /* type */
  255. put_b(bc, s->title, strlen(s->title));
  256. }
  257. if (s->comment[0])
  258. {
  259. put_v(bc, 7); /* type */
  260. put_b(bc, s->comment, strlen(s->comment));
  261. }
  262. if (s->copyright[0])
  263. {
  264. put_v(bc, 8); /* type */
  265. put_b(bc, s->copyright, strlen(s->copyright));
  266. }
  267. /* encoder */
  268. put_v(bc, 9); /* type */
  269. put_b(bc, LIBAVFORMAT_IDENT "\0", strlen(LIBAVFORMAT_IDENT));
  270. put_v(bc, 0); /* eof info */
  271. put_be32(bc, 0); /* FIXME: checksum */
  272. update_packetheader(nut, bc, 0);
  273. #endif
  274. put_flush_packet(bc);
  275. return 0;
  276. }
  277. static int nut_write_packet(AVFormatContext *s, int stream_index,
  278. const uint8_t *buf, int size, int64_t pts)
  279. {
  280. NUTContext *nut = s->priv_data;
  281. ByteIOContext *bc = &s->pb;
  282. int key_frame = 0;
  283. int flags;
  284. AVCodecContext *enc;
  285. if (stream_index > s->nb_streams)
  286. return 1;
  287. enc = &s->streams[stream_index]->codec;
  288. key_frame = enc->coded_frame->key_frame;
  289. if (key_frame)
  290. put_be64(bc, KEYFRAME_STARTCODE);
  291. flags=0;
  292. flags<<=2; flags|=1; //priority
  293. flags<<=1; flags|=0; //checksum
  294. flags<<=1; flags|=0; //msb_timestamp_flag
  295. flags<<=2; flags|=1; //subpacket_type
  296. flags<<=1; flags|=0; //reserved
  297. put_byte(bc, flags);
  298. put_packetheader(nut, bc, size+20);
  299. put_v(bc, stream_index);
  300. put_s(bc, pts); /* lsb_timestamp */
  301. update_packetheader(nut, bc, size);
  302. put_buffer(bc, buf, size);
  303. put_flush_packet(bc);
  304. return 0;
  305. }
  306. static int nut_write_trailer(AVFormatContext *s)
  307. {
  308. ByteIOContext *bc = &s->pb;
  309. #if 0
  310. int i;
  311. /* WRITE INDEX */
  312. for (i = 0; s->nb_streams; i++)
  313. {
  314. put_be64(bc, INDEX_STARTCODE);
  315. put_packetheader(nut, bc, 64);
  316. put_v(bc, s->streams[i]->id);
  317. put_v(bc, ...);
  318. put_be32(bc, 0); /* FIXME: checksum */
  319. update_packetheader(nut, bc, 0);
  320. }
  321. #endif
  322. put_flush_packet(bc);
  323. return 0;
  324. }
  325. #endif //CONFIG_ENCODERS
  326. static int nut_probe(AVProbeData *p)
  327. {
  328. int i;
  329. uint64_t code;
  330. code = 0xff;
  331. for (i = 0; i < p->buf_size; i++) {
  332. int c = p->buf[i];
  333. code = (code << 8) | c;
  334. if (code == MAIN_STARTCODE)
  335. return AVPROBE_SCORE_MAX;
  336. }
  337. return 0;
  338. }
  339. static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
  340. {
  341. NUTContext *nut = s->priv_data;
  342. ByteIOContext *bc = &s->pb;
  343. uint64_t tmp;
  344. int cur_stream, nb_streams;
  345. /* main header */
  346. tmp = get_be64(bc);
  347. if (tmp != MAIN_STARTCODE)
  348. fprintf(stderr, "damaged? startcode!=1 (%Ld)\n", tmp);
  349. get_packetheader(nut, bc);
  350. tmp = get_v(bc);
  351. if (tmp != 0)
  352. fprintf(stderr, "bad version (%Ld)\n", tmp);
  353. nb_streams = get_v(bc);
  354. get_be32(bc); /* checkusm */
  355. s->bit_rate = 0;
  356. /* stream header */
  357. for (cur_stream = 0; cur_stream < nb_streams; cur_stream++)
  358. {
  359. int class, nom, denom;
  360. AVStream *st;
  361. tmp = get_be64(bc);
  362. if (tmp != STREAM_STARTCODE)
  363. fprintf(stderr, "damaged? startcode!=1 (%Ld)\n", tmp);
  364. get_packetheader(nut, bc);
  365. st = av_new_stream(s, get_v(bc));
  366. if (!st)
  367. return AVERROR_NOMEM;
  368. class = get_v(bc);
  369. tmp = get_bi(bc);
  370. switch(class)
  371. {
  372. case 0:
  373. st->codec.codec_type = CODEC_TYPE_VIDEO;
  374. st->codec.codec_id = codec_get_bmp_id(tmp);
  375. if (st->codec.codec_id == CODEC_ID_NONE)
  376. fprintf(stderr, "Unknown codec?!\n");
  377. break;
  378. case 32:
  379. st->codec.codec_type = CODEC_TYPE_AUDIO;
  380. st->codec.codec_id = codec_get_wav_id(tmp);
  381. if (st->codec.codec_id == CODEC_ID_NONE)
  382. fprintf(stderr, "Unknown codec?!\n");
  383. break;
  384. default:
  385. fprintf(stderr, "Unknown stream class (%d)\n", class);
  386. return -1;
  387. }
  388. s->bit_rate += get_v(bc);
  389. get_b(bc, NULL, 0); /* language code */
  390. nom = get_v(bc);
  391. denom = get_v(bc);
  392. get_v(bc); /* FIXME: msb timestamp base */
  393. get_v(bc); /* shuffle type */
  394. get_byte(bc); /* flags */
  395. /* codec specific data headers */
  396. while(get_v(bc) != 0)
  397. url_fskip(bc, get_v(bc));
  398. if (class == 0) /* VIDEO */
  399. {
  400. st->codec.width = get_v(bc);
  401. st->codec.height = get_v(bc);
  402. get_v(bc); /* aspected w */
  403. get_v(bc); /* aspected h */
  404. get_v(bc); /* csp type */
  405. get_be32(bc); /* checksum */
  406. st->codec.frame_rate = nom;
  407. st->codec.frame_rate_base = denom;
  408. }
  409. if (class == 32) /* AUDIO */
  410. {
  411. st->codec.sample_rate = (get_v(bc) * nom) / denom;
  412. st->codec.channels = get_v(bc);
  413. get_be32(bc); /* checksum */
  414. }
  415. }
  416. return 0;
  417. }
  418. static int nut_read_packet(AVFormatContext *s, AVPacket *pkt)
  419. {
  420. NUTContext *nut = s->priv_data;
  421. ByteIOContext *bc = &s->pb;
  422. int id, timestamp, size;
  423. int key_frame = 0;
  424. uint64_t tmp;
  425. if (url_feof(bc))
  426. return -1;
  427. tmp = get_byte(bc);
  428. if (tmp & 0x80) /* zero bit set? */
  429. {
  430. tmp<<=8 ; tmp |= get_byte(bc);
  431. tmp<<=16; tmp |= get_be16(bc);
  432. tmp<<=32; tmp |= get_be32(bc);
  433. if (tmp == KEYFRAME_STARTCODE)
  434. {
  435. key_frame = 1;
  436. tmp = get_byte(bc); /* flags */
  437. }
  438. else
  439. fprintf(stderr, "error in zero bit / startcode %LX\n", tmp);
  440. }
  441. get_packetheader(nut, bc);
  442. #if 0
  443. if (((tmp & 0x60)>>5) > 3) /* priority <= 3 */
  444. fprintf(stderr, "sanity check failed!\n");
  445. #endif
  446. id = get_v(bc);
  447. timestamp = get_s(bc);
  448. size = (nut->curr_frame_size - (url_ftell(bc)-nut->curr_frame_start));
  449. dprintf("flags: 0x%Lx, timestamp: %d, packet size: %d\n", tmp, timestamp, size);
  450. if (size < 0)
  451. return -1;
  452. av_new_packet(pkt, size);
  453. get_buffer(bc, pkt->data, size);
  454. pkt->stream_index = id;
  455. if (key_frame)
  456. pkt->flags |= PKT_FLAG_KEY;
  457. pkt->pts = timestamp;
  458. return 0;
  459. }
  460. static AVInputFormat nut_iformat = {
  461. "nut",
  462. "nut format",
  463. sizeof(NUTContext),
  464. nut_probe,
  465. nut_read_header,
  466. nut_read_packet,
  467. // nut_read_close,
  468. // nut_read_seek,
  469. .extensions = "nut",
  470. };
  471. #ifdef CONFIG_ENCODERS
  472. static AVOutputFormat nut_oformat = {
  473. "nut",
  474. "nut format",
  475. "video/x-nut",
  476. "nut",
  477. sizeof(NUTContext),
  478. #ifdef CONFIG_VORBIS
  479. CODEC_ID_VORBIS,
  480. #elif defined(CONFIG_MP3LAME)
  481. CODEC_ID_MP3,
  482. #else
  483. CODEC_ID_MP2, /* AC3 needs liba52 decoder */
  484. #endif
  485. CODEC_ID_MPEG4,
  486. nut_write_header,
  487. nut_write_packet,
  488. nut_write_trailer,
  489. };
  490. #endif //CONFIG_ENCODERS
  491. int nut_init(void)
  492. {
  493. av_register_input_format(&nut_iformat);
  494. #ifdef CONFIG_ENCODERS
  495. av_register_output_format(&nut_oformat);
  496. #endif //CONFIG_ENCODERS
  497. return 0;
  498. }