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
14KB

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