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.

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