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.

664 lines
16KB

  1. /*
  2. * Various utilities for ffmpeg system
  3. * Copyright (c) 2000,2001 Gerard Lantau
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program 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
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include "avformat.h"
  20. #include "tick.h"
  21. #ifndef CONFIG_WIN32
  22. #include <unistd.h>
  23. #include <fcntl.h>
  24. #include <sys/time.h>
  25. #include <time.h>
  26. #else
  27. #define strcasecmp _stricmp
  28. #include <sys/types.h>
  29. #include <sys/timeb.h>
  30. #endif
  31. AVFormat *first_format;
  32. void register_avformat(AVFormat *format)
  33. {
  34. AVFormat **p;
  35. p = &first_format;
  36. while (*p != NULL) p = &(*p)->next;
  37. *p = format;
  38. format->next = NULL;
  39. }
  40. int match_ext(const char *filename, const char *extensions)
  41. {
  42. const char *ext, *p;
  43. char ext1[32], *q;
  44. ext = strrchr(filename, '.');
  45. if (ext) {
  46. ext++;
  47. p = extensions;
  48. for(;;) {
  49. q = ext1;
  50. while (*p != '\0' && *p != ',')
  51. *q++ = *p++;
  52. *q = '\0';
  53. if (!strcasecmp(ext1, ext))
  54. return 1;
  55. if (*p == '\0')
  56. break;
  57. p++;
  58. }
  59. }
  60. return 0;
  61. }
  62. AVFormat *guess_format(const char *short_name, const char *filename, const char *mime_type)
  63. {
  64. AVFormat *fmt, *fmt_found;
  65. int score_max, score;
  66. /* find the proper file type */
  67. fmt_found = NULL;
  68. score_max = 0;
  69. fmt = first_format;
  70. while (fmt != NULL) {
  71. score = 0;
  72. if (fmt->name && short_name && !strcmp(fmt->name, short_name))
  73. score += 100;
  74. if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
  75. score += 10;
  76. if (filename && fmt->extensions &&
  77. match_ext(filename, fmt->extensions)) {
  78. score += 5;
  79. }
  80. if (score > score_max) {
  81. score_max = score;
  82. fmt_found = fmt;
  83. }
  84. fmt = fmt->next;
  85. }
  86. return fmt_found;
  87. }
  88. /* return TRUE if val is a prefix of str. If it returns TRUE, ptr is
  89. set to the next character in 'str' after the prefix */
  90. int strstart(const char *str, const char *val, const char **ptr)
  91. {
  92. const char *p, *q;
  93. p = str;
  94. q = val;
  95. while (*q != '\0') {
  96. if (*p != *q)
  97. return 0;
  98. p++;
  99. q++;
  100. }
  101. if (ptr)
  102. *ptr = p;
  103. return 1;
  104. }
  105. void nstrcpy(char *buf, int buf_size, const char *str)
  106. {
  107. int c;
  108. char *q = buf;
  109. for(;;) {
  110. c = *str++;
  111. if (c == 0 || q >= buf + buf_size - 1)
  112. break;
  113. *q++ = c;
  114. }
  115. *q = '\0';
  116. }
  117. void strlcpy(char *dst, const char *src, int len)
  118. {
  119. int slen = strlen(src) + 1;
  120. if (slen <= len) {
  121. memcpy(dst, src, slen);
  122. } else {
  123. memcpy(dst, src, len - 1);
  124. dst[len - 1] = 0;
  125. }
  126. }
  127. void register_all(void)
  128. {
  129. avcodec_init();
  130. avcodec_register_all();
  131. register_avformat(&mp2_format);
  132. register_avformat(&ac3_format);
  133. register_avformat(&mpeg_mux_format);
  134. register_avformat(&mpeg1video_format);
  135. register_avformat(&mjpeg_format);
  136. register_avformat(&h263_format);
  137. register_avformat(&rm_format);
  138. register_avformat(&asf_format);
  139. register_avformat(&avi_format);
  140. register_avformat(&mov_format);
  141. register_avformat(&mp4_format);
  142. register_avformat(&mpjpeg_format);
  143. register_avformat(&jpeg_format);
  144. register_avformat(&single_jpeg_format);
  145. register_avformat(&swf_format);
  146. register_avformat(&gif_format);
  147. register_avformat(&au_format);
  148. register_avformat(&wav_format);
  149. register_avformat(&crc_format);
  150. register_avformat(&pcm_s16le_format);
  151. register_avformat(&pcm_s16be_format);
  152. register_avformat(&pcm_u16le_format);
  153. register_avformat(&pcm_u16be_format);
  154. register_avformat(&pcm_s8_format);
  155. register_avformat(&pcm_u8_format);
  156. register_avformat(&pcm_mulaw_format);
  157. register_avformat(&pcm_alaw_format);
  158. register_avformat(&rawvideo_format);
  159. #ifndef CONFIG_WIN32
  160. register_avformat(&ffm_format);
  161. #endif
  162. register_avformat(&pgm_format);
  163. register_avformat(&ppm_format);
  164. register_avformat(&pgmyuv_format);
  165. register_avformat(&imgyuv_format);
  166. register_avformat(&pgmpipe_format);
  167. register_avformat(&pgmyuvpipe_format);
  168. register_avformat(&ppmpipe_format);
  169. #ifdef CONFIG_GRAB
  170. register_avformat(&video_grab_device_format);
  171. register_avformat(&audio_device_format);
  172. #endif
  173. /* file protocols */
  174. register_protocol(&file_protocol);
  175. register_protocol(&pipe_protocol);
  176. #ifndef CONFIG_WIN32
  177. register_protocol(&udp_protocol);
  178. register_protocol(&http_protocol);
  179. #endif
  180. }
  181. /* memory handling */
  182. int av_new_packet(AVPacket *pkt, int size)
  183. {
  184. pkt->data = av_malloc(size);
  185. if (!pkt->data)
  186. return -ENOMEM;
  187. pkt->size = size;
  188. /* sane state */
  189. pkt->pts = 0;
  190. pkt->stream_index = 0;
  191. pkt->flags = 0;
  192. return 0;
  193. }
  194. void av_free_packet(AVPacket *pkt)
  195. {
  196. av_freep(&pkt->data);
  197. /* fail safe */
  198. pkt->size = 0;
  199. }
  200. /* fifo handling */
  201. int fifo_init(FifoBuffer *f, int size)
  202. {
  203. f->buffer = av_malloc(size);
  204. if (!f->buffer)
  205. return -1;
  206. f->end = f->buffer + size;
  207. f->wptr = f->rptr = f->buffer;
  208. return 0;
  209. }
  210. void fifo_free(FifoBuffer *f)
  211. {
  212. av_free(f->buffer);
  213. }
  214. int fifo_size(FifoBuffer *f, UINT8 *rptr)
  215. {
  216. int size;
  217. if (f->wptr >= rptr) {
  218. size = f->wptr - rptr;
  219. } else {
  220. size = (f->end - rptr) + (f->wptr - f->buffer);
  221. }
  222. return size;
  223. }
  224. /* get data from the fifo (return -1 if not enough data) */
  225. int fifo_read(FifoBuffer *f, UINT8 *buf, int buf_size, UINT8 **rptr_ptr)
  226. {
  227. UINT8 *rptr = *rptr_ptr;
  228. int size, len;
  229. if (f->wptr >= rptr) {
  230. size = f->wptr - rptr;
  231. } else {
  232. size = (f->end - rptr) + (f->wptr - f->buffer);
  233. }
  234. if (size < buf_size)
  235. return -1;
  236. while (buf_size > 0) {
  237. len = f->end - rptr;
  238. if (len > buf_size)
  239. len = buf_size;
  240. memcpy(buf, rptr, len);
  241. buf += len;
  242. rptr += len;
  243. if (rptr >= f->end)
  244. rptr = f->buffer;
  245. buf_size -= len;
  246. }
  247. *rptr_ptr = rptr;
  248. return 0;
  249. }
  250. void fifo_write(FifoBuffer *f, UINT8 *buf, int size, UINT8 **wptr_ptr)
  251. {
  252. int len;
  253. UINT8 *wptr;
  254. wptr = *wptr_ptr;
  255. while (size > 0) {
  256. len = f->end - wptr;
  257. if (len > size)
  258. len = size;
  259. memcpy(wptr, buf, len);
  260. wptr += len;
  261. if (wptr >= f->end)
  262. wptr = f->buffer;
  263. buf += len;
  264. size -= len;
  265. }
  266. *wptr_ptr = wptr;
  267. }
  268. /* media file handling.
  269. 'filename' is the filename to open.
  270. 'format_name' is used to force the file format (NULL if auto guess).
  271. 'buf_size' is the optional buffer size (zero if default is OK).
  272. 'ap' are additionnal parameters needed when opening the file (NULL if default).
  273. */
  274. AVFormatContext *av_open_input_file(const char *filename,
  275. const char *format_name,
  276. int buf_size,
  277. AVFormatParameters *ap)
  278. {
  279. AVFormat *fmt;
  280. AVFormatContext *ic = NULL;
  281. int err;
  282. ic = av_mallocz(sizeof(AVFormatContext));
  283. if (!ic)
  284. goto fail;
  285. /* find format */
  286. if (format_name != NULL) {
  287. fmt = guess_format(format_name, NULL, NULL);
  288. } else {
  289. fmt = guess_format(NULL, filename, NULL);
  290. }
  291. if (!fmt || !fmt->read_header) {
  292. return NULL;
  293. }
  294. ic->format = fmt;
  295. /* if no file needed do not try to open one */
  296. if (!(fmt->flags & AVFMT_NOFILE)) {
  297. if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0)
  298. goto fail;
  299. if (buf_size > 0) {
  300. url_setbufsize(&ic->pb, buf_size);
  301. }
  302. }
  303. err = ic->format->read_header(ic, ap);
  304. if (err < 0) {
  305. if (!(fmt->flags & AVFMT_NOFILE)) {
  306. url_fclose(&ic->pb);
  307. }
  308. goto fail;
  309. }
  310. return ic;
  311. fail:
  312. av_free(ic);
  313. return NULL;
  314. }
  315. int av_read_packet(AVFormatContext *s, AVPacket *pkt)
  316. {
  317. AVPacketList *pktl;
  318. pktl = s->packet_buffer;
  319. if (pktl) {
  320. /* read packet from packet buffer, if there is data */
  321. *pkt = pktl->pkt;
  322. s->packet_buffer = pktl->next;
  323. av_free(pktl);
  324. return 0;
  325. } else {
  326. return s->format->read_packet(s, pkt);
  327. }
  328. }
  329. void av_close_input_file(AVFormatContext *s)
  330. {
  331. int i;
  332. if (s->format->read_close)
  333. s->format->read_close(s);
  334. for(i=0;i<s->nb_streams;i++) {
  335. av_free(s->streams[i]);
  336. }
  337. if (s->packet_buffer) {
  338. AVPacketList *p, *p1;
  339. p = s->packet_buffer;
  340. while (p != NULL) {
  341. p1 = p->next;
  342. av_free_packet(&p->pkt);
  343. av_free(p);
  344. p = p1;
  345. }
  346. s->packet_buffer = NULL;
  347. }
  348. if (!(s->format->flags & AVFMT_NOFILE)) {
  349. url_fclose(&s->pb);
  350. }
  351. av_free(s);
  352. }
  353. int av_write_packet(AVFormatContext *s, AVPacket *pkt, int force_pts)
  354. {
  355. /* XXX: currently, an emulation because internal API must change */
  356. return s->format->write_packet(s, pkt->stream_index, pkt->data, pkt->size, force_pts);
  357. }
  358. /* "user interface" functions */
  359. void dump_format(AVFormatContext *ic,
  360. int index,
  361. const char *url,
  362. int is_output)
  363. {
  364. int i;
  365. char buf[256];
  366. fprintf(stderr, "%s #%d, %s, %s '%s':\n",
  367. is_output ? "Output" : "Input",
  368. index, ic->format->name,
  369. is_output ? "to" : "from", url);
  370. for(i=0;i<ic->nb_streams;i++) {
  371. AVStream *st = ic->streams[i];
  372. avcodec_string(buf, sizeof(buf), &st->codec, is_output);
  373. fprintf(stderr, " Stream #%d.%d: %s\n", index, i, buf);
  374. }
  375. }
  376. typedef struct {
  377. const char *str;
  378. int width, height;
  379. } SizeEntry;
  380. static SizeEntry sizes[] = {
  381. { "sqcif", 128, 96 },
  382. { "qcif", 176, 144 },
  383. { "cif", 352, 288 },
  384. { "4cif", 704, 576 },
  385. };
  386. int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
  387. {
  388. int i;
  389. int n = sizeof(sizes) / sizeof(SizeEntry);
  390. const char *p;
  391. int frame_width = 0, frame_height = 0;
  392. for(i=0;i<n;i++) {
  393. if (!strcmp(sizes[i].str, str)) {
  394. frame_width = sizes[i].width;
  395. frame_height = sizes[i].height;
  396. break;
  397. }
  398. }
  399. if (i == n) {
  400. p = str;
  401. frame_width = strtol(p, (char **)&p, 10);
  402. if (*p)
  403. p++;
  404. frame_height = strtol(p, (char **)&p, 10);
  405. }
  406. if (frame_width <= 0 || frame_height <= 0)
  407. return -1;
  408. *width_ptr = frame_width;
  409. *height_ptr = frame_height;
  410. return 0;
  411. }
  412. INT64 gettime(void)
  413. {
  414. #ifdef CONFIG_WIN32
  415. struct _timeb tb;
  416. _ftime(&tb);
  417. return ((INT64)tb.time * INT64_C(1000) + (INT64)tb.millitm) * INT64_C(1000);
  418. #else
  419. struct timeval tv;
  420. gettimeofday(&tv,NULL);
  421. return (INT64)tv.tv_sec * 1000000 + tv.tv_usec;
  422. #endif
  423. }
  424. /* syntax: [YYYY-MM-DD ][[HH:]MM:]SS[.m...] . Return the date in micro seconds since 1970 */
  425. INT64 parse_date(const char *datestr, int duration)
  426. {
  427. const char *p;
  428. INT64 t;
  429. int sec;
  430. p = datestr;
  431. if (!duration) {
  432. static const UINT8 months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  433. int year, month, day, i;
  434. if (strlen(p) >= 5 && p[4] == '-') {
  435. year = strtol(p, (char **)&p, 10);
  436. if (*p)
  437. p++;
  438. month = strtol(p, (char **)&p, 10) - 1;
  439. if (*p)
  440. p++;
  441. day = strtol(p, (char **)&p, 10) - 1;
  442. if (*p)
  443. p++;
  444. day += (year - 1970) * 365;
  445. /* if >= March, take February of current year into account too */
  446. if (month >= 2)
  447. year++;
  448. for(i=1970;i<year;i++) {
  449. if ((i % 100) == 0) {
  450. if ((i % 400) == 0) day++;
  451. } else if ((i % 4) == 0) {
  452. day++;
  453. }
  454. }
  455. for(i=0;i<month;i++)
  456. day += months[i];
  457. } else {
  458. day = (time(NULL) / (3600 * 24));
  459. }
  460. t = day * (3600 * 24);
  461. } else {
  462. t = 0;
  463. }
  464. sec = 0;
  465. for(;;) {
  466. int val;
  467. val = strtol(p, (char **)&p, 10);
  468. sec = sec * 60 + val;
  469. if (*p != ':')
  470. break;
  471. p++;
  472. }
  473. t = (t + sec) * 1000000;
  474. if (*p == '.') {
  475. int val, n;
  476. p++;
  477. n = strlen(p);
  478. if (n > 6)
  479. n = 6;
  480. val = strtol(p, NULL, 10);
  481. while (n < 6) {
  482. val = val * 10;
  483. n++;
  484. }
  485. t += val;
  486. }
  487. return t;
  488. }
  489. /* syntax: '?tag1=val1&tag2=val2...'. No URL decoding is done. Return
  490. 1 if found */
  491. int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
  492. {
  493. const char *p;
  494. char tag[128], *q;
  495. p = info;
  496. if (*p == '?')
  497. p++;
  498. for(;;) {
  499. q = tag;
  500. while (*p != '\0' && *p != '=' && *p != '&') {
  501. if ((q - tag) < sizeof(tag) - 1)
  502. *q++ = *p;
  503. p++;
  504. }
  505. *q = '\0';
  506. q = arg;
  507. if (*p == '=') {
  508. p++;
  509. while (*p != '&' && *p != '\0') {
  510. if ((q - arg) < arg_size - 1)
  511. *q++ = *p;
  512. p++;
  513. }
  514. *q = '\0';
  515. }
  516. if (!strcmp(tag, tag1))
  517. return 1;
  518. if (*p != '&')
  519. break;
  520. p++;
  521. }
  522. return 0;
  523. }
  524. /* Return in 'buf' the path with '%d' replaced by number. Also handles
  525. the '%0nd' format where 'n' is the total number of digits and
  526. '%%'. Return 0 if OK, and -1 if format error */
  527. int get_frame_filename(char *buf, int buf_size,
  528. const char *path, int number)
  529. {
  530. const char *p;
  531. char *q, buf1[20];
  532. int nd, len, c, percentd_found;
  533. q = buf;
  534. p = path;
  535. percentd_found = 0;
  536. for(;;) {
  537. c = *p++;
  538. if (c == '\0')
  539. break;
  540. if (c == '%') {
  541. nd = 0;
  542. while (*p >= '0' && *p <= '9') {
  543. nd = nd * 10 + *p++ - '0';
  544. }
  545. c = *p++;
  546. switch(c) {
  547. case '%':
  548. goto addchar;
  549. case 'd':
  550. if (percentd_found)
  551. goto fail;
  552. percentd_found = 1;
  553. snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
  554. len = strlen(buf1);
  555. if ((q - buf + len) > buf_size - 1)
  556. goto fail;
  557. memcpy(q, buf1, len);
  558. q += len;
  559. break;
  560. default:
  561. goto fail;
  562. }
  563. } else {
  564. addchar:
  565. if ((q - buf) < buf_size - 1)
  566. *q++ = c;
  567. }
  568. }
  569. if (!percentd_found)
  570. goto fail;
  571. *q = '\0';
  572. return 0;
  573. fail:
  574. *q = '\0';
  575. return -1;
  576. }
  577. static int gcd(INT64 a, INT64 b)
  578. {
  579. INT64 c;
  580. while (1) {
  581. c = a % b;
  582. if (c == 0)
  583. return b;
  584. a = b;
  585. b = c;
  586. }
  587. }
  588. void ticker_init(Ticker *tick, INT64 inrate, INT64 outrate)
  589. {
  590. int g;
  591. g = gcd(inrate, outrate);
  592. inrate /= g;
  593. outrate /= g;
  594. tick->value = -outrate/2;
  595. tick->inrate = inrate;
  596. tick->outrate = outrate;
  597. tick->div = tick->outrate / tick->inrate;
  598. tick->mod = tick->outrate % tick->inrate;
  599. }