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.

586 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)
  77. {
  78. int i, len, val;
  79. len = get_v(bc);
  80. val = 0;
  81. for (i = 0; i < len; i++) {
  82. if (i < 4)
  83. val |= get_byte(bc) << (i * 8);
  84. }
  85. return val;
  86. }
  87. static int get_packetheader(NUTContext *nut, ByteIOContext *bc)
  88. {
  89. nut->curr_frame_start = url_ftell(bc);
  90. nut->curr_frame_size = get_v(bc);
  91. nut->last_frame_size = get_v(bc);
  92. dprintf("Packet: fwd: %d bwd: %d\n",
  93. nut->curr_frame_size, nut->last_frame_size);
  94. return 0;
  95. }
  96. /**
  97. *
  98. */
  99. static int get_length(uint64_t val){
  100. int i;
  101. for (i=7; ; i+=7)
  102. if ((val>>i) == 0)
  103. return i;
  104. return 7; //not reached
  105. }
  106. static int put_v(ByteIOContext *bc, uint64_t val)
  107. {
  108. int i;
  109. // if (bytes_left(s)*8 < 9)
  110. // return -1;
  111. if (bytes_left(bc) < 1)
  112. return -1;
  113. val &= 0x7FFFFFFFFFFFFFFFULL; // FIXME can only encode upto 63 bits currently
  114. i= get_length(val);
  115. for (i-=7; i>0; i-=7){
  116. put_byte(bc, 0x80 | (val>>i));
  117. }
  118. put_byte(bc, val&0x7f);
  119. return 0;
  120. }
  121. static int put_s(ByteIOContext *bc, uint64_t val)
  122. {
  123. if (val<=0)
  124. return put_v(bc, -2*val);
  125. else
  126. return put_v(bc, 2*val-1);
  127. }
  128. static int put_b(ByteIOContext *bc, char *data, int len)
  129. {
  130. int i;
  131. put_v(bc, len);
  132. for (i = 0; i < len; i++)
  133. put_byte(bc, data[i]);
  134. return 0;
  135. }
  136. static int put_bi(ByteIOContext *bc, int val)
  137. {
  138. put_v(bc, 4);
  139. put_le32(bc, val);
  140. return 0;
  141. }
  142. static int put_packetheader(NUTContext *nut, ByteIOContext *bc, int max_size)
  143. {
  144. put_flush_packet(bc);
  145. nut->curr_frame_start = url_ftell(bc);
  146. nut->curr_frame_size = max_size;
  147. /* packet header */
  148. put_v(bc, nut->curr_frame_size); /* forward ptr */
  149. put_v(bc, nut->last_frame_size); /* backward ptr */
  150. dprintf("Packet: fwd: %d, bwd: %d\n",
  151. nut->curr_frame_size, nut->last_frame_size);
  152. nut->last_frame_size = nut->curr_frame_size;
  153. return 0;
  154. }
  155. static int update_packetheader(NUTContext *nut, ByteIOContext *bc, int additional_size){
  156. offset_t start= nut->curr_frame_start;
  157. offset_t cur= url_ftell(bc);
  158. int size= cur - start + additional_size;
  159. assert( size <= nut->curr_frame_size );
  160. url_fseek(bc, start, SEEK_SET);
  161. put_v(bc, size);
  162. if(get_length(size) < get_length(nut->curr_frame_size))
  163. put_byte(bc, 0x80);
  164. nut->curr_frame_size= size;
  165. dprintf("Packet update: size: %d\n", size);
  166. url_fseek(bc, cur, SEEK_SET);
  167. return 0;
  168. }
  169. static int nut_write_header(AVFormatContext *s)
  170. {
  171. NUTContext *nut = s->priv_data;
  172. ByteIOContext *bc = &s->pb;
  173. AVCodecContext *codec;
  174. int i;
  175. int stream_length = 0;
  176. for (i = 0; i < s->nb_streams; i++)
  177. {
  178. if (stream_length < (s->streams[i]->duration * (AV_TIME_BASE / 1000)))
  179. stream_length = s->streams[i]->duration * (AV_TIME_BASE / 1000);
  180. }
  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_v(bc, 0); /* file size */
  187. put_v(bc, stream_length); /* len in msec */
  188. put_be32(bc, 0); /* FIXME: checksum */
  189. update_packetheader(nut, bc, 0);
  190. /* stream headers */
  191. for (i = 0; i < s->nb_streams; i++)
  192. {
  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. }
  205. else if (codec->codec_type == CODEC_TYPE_AUDIO)
  206. {
  207. int tmp = codec_get_wav_tag(codec->codec_id);
  208. put_bi(bc, tmp);
  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. default:
  234. break;
  235. }
  236. update_packetheader(nut, bc, 0);
  237. }
  238. #if 0
  239. /* info header */
  240. put_be64(bc, INFO_STARTCODE);
  241. put_packetheader(nut, bc, 16+strlen(s->author)+strlen(s->title)+
  242. strlen(s->comment)+strlen(s->copyright));
  243. if (s->author[0])
  244. {
  245. put_v(bc, 5); /* type */
  246. put_b(bc, s->author, strlen(s->author));
  247. }
  248. if (s->title[0])
  249. {
  250. put_v(bc, 6); /* type */
  251. put_b(bc, s->title, strlen(s->title));
  252. }
  253. if (s->comment[0])
  254. {
  255. put_v(bc, 7); /* type */
  256. put_b(bc, s->comment, strlen(s->comment));
  257. }
  258. if (s->copyright[0])
  259. {
  260. put_v(bc, 8); /* type */
  261. put_b(bc, s->copyright, strlen(s->copyright));
  262. }
  263. /* encoder */
  264. put_v(bc, 9); /* type */
  265. put_b(bc, LIBAVFORMAT_IDENT "\0", strlen(LIBAVFORMAT_IDENT));
  266. put_v(bc, 0); /* eof info */
  267. put_be32(bc, 0); /* FIXME: checksum */
  268. update_packetheader(nut, bc, 0);
  269. #endif
  270. put_flush_packet(bc);
  271. return 0;
  272. }
  273. static int nut_write_packet(AVFormatContext *s, int stream_index,
  274. uint8_t *buf, int size, int force_pts)
  275. {
  276. NUTContext *nut = s->priv_data;
  277. ByteIOContext *bc = &s->pb;
  278. int key_frame = 0;
  279. int flags;
  280. AVCodecContext *enc;
  281. if (stream_index > s->nb_streams)
  282. return 1;
  283. enc = &s->streams[stream_index]->codec;
  284. if (enc->codec_type == CODEC_TYPE_VIDEO)
  285. key_frame = enc->coded_frame->key_frame;
  286. if (key_frame)
  287. put_be64(bc, KEYFRAME_STARTCODE);
  288. flags=0;
  289. flags<<=2; flags|=1; //priority
  290. flags<<=1; flags|=0; //checksum
  291. flags<<=1; flags|=0; //msb_timestamp_flag
  292. flags<<=2; flags|=1; //subpacket_type
  293. flags<<=1; flags|=0; //reserved
  294. put_byte(bc, flags);
  295. put_packetheader(nut, bc, size+20);
  296. put_v(bc, stream_index);
  297. put_s(bc, force_pts); /* lsb_timestamp */
  298. update_packetheader(nut, bc, size);
  299. put_buffer(bc, buf, size);
  300. put_flush_packet(bc);
  301. return 0;
  302. }
  303. static int nut_write_trailer(AVFormatContext *s)
  304. {
  305. ByteIOContext *bc = &s->pb;
  306. #if 0
  307. int i;
  308. /* WRITE INDEX */
  309. for (i = 0; s->nb_streams; i++)
  310. {
  311. put_be64(bc, INDEX_STARTCODE);
  312. put_packetheader(nut, bc, 64);
  313. put_v(bc, s->streams[i]->id);
  314. put_v(bc, ...);
  315. put_be32(bc, 0); /* FIXME: checksum */
  316. update_packetheader(nut, bc, 0);
  317. }
  318. #endif
  319. put_flush_packet(bc);
  320. return 0;
  321. }
  322. static int nut_probe(AVProbeData *p)
  323. {
  324. int i;
  325. uint64_t code;
  326. code = 0xff;
  327. for (i = 0; i < p->buf_size; i++) {
  328. int c = p->buf[i];
  329. code = (code << 8) | c;
  330. code &= 0xFFFFFFFFFFFFFFFFULL;
  331. if (code == MAIN_STARTCODE)
  332. return AVPROBE_SCORE_MAX;
  333. }
  334. return 0;
  335. }
  336. static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
  337. {
  338. NUTContext *nut = s->priv_data;
  339. ByteIOContext *bc = &s->pb;
  340. uint64_t tmp;
  341. int cur_stream, nb_streams;
  342. /* main header */
  343. tmp = get_be64(bc);
  344. if (tmp != MAIN_STARTCODE)
  345. fprintf(stderr, "damaged? startcode!=1 (%Ld)\n", tmp);
  346. get_packetheader(nut, bc);
  347. tmp = get_v(bc);
  348. if (tmp != 0)
  349. fprintf(stderr, "bad version (%Ld)\n", tmp);
  350. nb_streams = get_v(bc);
  351. s->file_size = get_v(bc);
  352. s->duration = get_v(bc) / (AV_TIME_BASE / 1000);
  353. get_be32(bc); /* checkusm */
  354. s->bit_rate = 0;
  355. /* stream header */
  356. for (cur_stream = 0; cur_stream < nb_streams; cur_stream++)
  357. {
  358. int class;
  359. AVStream *st;
  360. tmp = get_be64(bc);
  361. if (tmp != STREAM_STARTCODE)
  362. fprintf(stderr, "damaged? startcode!=1 (%Ld)\n", tmp);
  363. get_packetheader(nut, bc);
  364. st = av_new_stream(s, get_v(bc));
  365. if (!st)
  366. return AVERROR_NOMEM;
  367. class = get_v(bc);
  368. switch(class)
  369. {
  370. case 0:
  371. st->codec.codec_type = CODEC_TYPE_VIDEO;
  372. tmp = get_b(bc);
  373. st->codec.codec_id = codec_get_bmp_id(tmp);
  374. if (st->codec.codec_id == CODEC_ID_NONE)
  375. fprintf(stderr, "Unknown codec?!\n");
  376. break;
  377. case 32:
  378. st->codec.codec_type = CODEC_TYPE_AUDIO;
  379. tmp = get_b(bc);
  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. tmp = get_v(bc); /* language code */
  390. while(tmp--)
  391. get_byte(bc);
  392. st->codec.frame_rate_base = get_v(bc);
  393. st->codec.frame_rate = get_v(bc);
  394. get_v(bc); /* FIXME: msb timestamp base */
  395. get_v(bc); /* shuffle type */
  396. get_byte(bc); /* flags */
  397. get_v(bc); /* FIXME: codec specific data headers */
  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_le32(bc); /* checksum */
  406. }
  407. if (class == 32) /* AUDIO */
  408. {
  409. st->codec.sample_rate = get_v(bc) * (double)(st->codec.frame_rate_base / st->codec.frame_rate);
  410. st->codec.channels = get_v(bc);
  411. get_le32(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. }