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.

527 lines
12KB

  1. /*
  2. * RAW muxer and demuxer
  3. * Copyright (c) 2001 Fabrice Bellard
  4. * Copyright (c) 2005 Alex Beregszaszi
  5. *
  6. * This file is part of FFmpeg.
  7. *
  8. * FFmpeg is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * FFmpeg is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with FFmpeg; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. #include "avformat.h"
  23. #include "raw.h"
  24. /* simple formats */
  25. #if CONFIG_MUXERS
  26. int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt)
  27. {
  28. put_buffer(s->pb, pkt->data, pkt->size);
  29. put_flush_packet(s->pb);
  30. return 0;
  31. }
  32. #endif
  33. #if CONFIG_DEMUXERS
  34. /* raw input */
  35. int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
  36. {
  37. AVStream *st;
  38. enum CodecID id;
  39. st = av_new_stream(s, 0);
  40. if (!st)
  41. return AVERROR(ENOMEM);
  42. id = s->iformat->value;
  43. if (id == CODEC_ID_RAWVIDEO) {
  44. st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
  45. } else {
  46. st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  47. }
  48. st->codec->codec_id = id;
  49. switch(st->codec->codec_type) {
  50. case AVMEDIA_TYPE_AUDIO:
  51. st->codec->sample_rate = ap->sample_rate;
  52. if(ap->channels) st->codec->channels = ap->channels;
  53. else st->codec->channels = 1;
  54. st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id);
  55. assert(st->codec->bits_per_coded_sample > 0);
  56. st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8;
  57. av_set_pts_info(st, 64, 1, st->codec->sample_rate);
  58. break;
  59. case AVMEDIA_TYPE_VIDEO:
  60. if(ap->time_base.num)
  61. av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
  62. else
  63. av_set_pts_info(st, 64, 1, 25);
  64. st->codec->width = ap->width;
  65. st->codec->height = ap->height;
  66. st->codec->pix_fmt = ap->pix_fmt;
  67. if(st->codec->pix_fmt == PIX_FMT_NONE)
  68. st->codec->pix_fmt= PIX_FMT_YUV420P;
  69. break;
  70. default:
  71. return -1;
  72. }
  73. return 0;
  74. }
  75. #define RAW_PACKET_SIZE 1024
  76. int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
  77. {
  78. int ret, size;
  79. size = RAW_PACKET_SIZE;
  80. if (av_new_packet(pkt, size) < 0)
  81. return AVERROR(ENOMEM);
  82. pkt->pos= url_ftell(s->pb);
  83. pkt->stream_index = 0;
  84. ret = get_partial_buffer(s->pb, pkt->data, size);
  85. if (ret < 0) {
  86. av_free_packet(pkt);
  87. return ret;
  88. }
  89. pkt->size = ret;
  90. return ret;
  91. }
  92. #endif
  93. #if CONFIG_RAWVIDEO_DEMUXER
  94. static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
  95. {
  96. int packet_size, ret, width, height;
  97. AVStream *st = s->streams[0];
  98. width = st->codec->width;
  99. height = st->codec->height;
  100. packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
  101. if (packet_size < 0)
  102. return -1;
  103. ret= av_get_packet(s->pb, pkt, packet_size);
  104. pkt->pts=
  105. pkt->dts= pkt->pos / packet_size;
  106. pkt->stream_index = 0;
  107. if (ret < 0)
  108. return ret;
  109. return 0;
  110. }
  111. #endif
  112. #if CONFIG_DEMUXERS
  113. int ff_raw_audio_read_header(AVFormatContext *s,
  114. AVFormatParameters *ap)
  115. {
  116. AVStream *st = av_new_stream(s, 0);
  117. if (!st)
  118. return AVERROR(ENOMEM);
  119. st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  120. st->codec->codec_id = s->iformat->value;
  121. st->need_parsing = AVSTREAM_PARSE_FULL;
  122. /* the parameters will be extracted from the compressed bitstream */
  123. return 0;
  124. }
  125. /* MPEG-1/H.263 input */
  126. int ff_raw_video_read_header(AVFormatContext *s,
  127. AVFormatParameters *ap)
  128. {
  129. AVStream *st;
  130. st = av_new_stream(s, 0);
  131. if (!st)
  132. return AVERROR(ENOMEM);
  133. st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
  134. st->codec->codec_id = s->iformat->value;
  135. st->need_parsing = AVSTREAM_PARSE_FULL;
  136. /* for MJPEG, specify frame rate */
  137. /* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
  138. if (ap->time_base.num) {
  139. st->codec->time_base= ap->time_base;
  140. } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
  141. st->codec->codec_id == CODEC_ID_MPEG4 ||
  142. st->codec->codec_id == CODEC_ID_DIRAC ||
  143. st->codec->codec_id == CODEC_ID_DNXHD ||
  144. st->codec->codec_id == CODEC_ID_VC1 ||
  145. st->codec->codec_id == CODEC_ID_H264) {
  146. st->codec->time_base= (AVRational){1,25};
  147. }
  148. av_set_pts_info(st, 64, 1, 1200000);
  149. return 0;
  150. }
  151. #endif
  152. /* Note: Do not forget to add new entries to the Makefile as well. */
  153. #if CONFIG_AC3_MUXER
  154. AVOutputFormat ac3_muxer = {
  155. "ac3",
  156. NULL_IF_CONFIG_SMALL("raw AC-3"),
  157. "audio/x-ac3",
  158. "ac3",
  159. 0,
  160. CODEC_ID_AC3,
  161. CODEC_ID_NONE,
  162. NULL,
  163. ff_raw_write_packet,
  164. .flags= AVFMT_NOTIMESTAMPS,
  165. };
  166. #endif
  167. #if CONFIG_DIRAC_MUXER
  168. AVOutputFormat dirac_muxer = {
  169. "dirac",
  170. NULL_IF_CONFIG_SMALL("raw Dirac"),
  171. NULL,
  172. "drc",
  173. 0,
  174. CODEC_ID_NONE,
  175. CODEC_ID_DIRAC,
  176. NULL,
  177. ff_raw_write_packet,
  178. .flags= AVFMT_NOTIMESTAMPS,
  179. };
  180. #endif
  181. #if CONFIG_DNXHD_MUXER
  182. AVOutputFormat dnxhd_muxer = {
  183. "dnxhd",
  184. NULL_IF_CONFIG_SMALL("raw DNxHD (SMPTE VC-3)"),
  185. NULL,
  186. "dnxhd",
  187. 0,
  188. CODEC_ID_NONE,
  189. CODEC_ID_DNXHD,
  190. NULL,
  191. ff_raw_write_packet,
  192. .flags= AVFMT_NOTIMESTAMPS,
  193. };
  194. #endif
  195. #if CONFIG_DTS_MUXER
  196. AVOutputFormat dts_muxer = {
  197. "dts",
  198. NULL_IF_CONFIG_SMALL("raw DTS"),
  199. "audio/x-dca",
  200. "dts",
  201. 0,
  202. CODEC_ID_DTS,
  203. CODEC_ID_NONE,
  204. NULL,
  205. ff_raw_write_packet,
  206. .flags= AVFMT_NOTIMESTAMPS,
  207. };
  208. #endif
  209. #if CONFIG_EAC3_MUXER
  210. AVOutputFormat eac3_muxer = {
  211. "eac3",
  212. NULL_IF_CONFIG_SMALL("raw E-AC-3"),
  213. "audio/x-eac3",
  214. "eac3",
  215. 0,
  216. CODEC_ID_EAC3,
  217. CODEC_ID_NONE,
  218. NULL,
  219. ff_raw_write_packet,
  220. .flags= AVFMT_NOTIMESTAMPS,
  221. };
  222. #endif
  223. #if CONFIG_GSM_DEMUXER
  224. AVInputFormat gsm_demuxer = {
  225. "gsm",
  226. NULL_IF_CONFIG_SMALL("raw GSM"),
  227. 0,
  228. NULL,
  229. ff_raw_audio_read_header,
  230. ff_raw_read_partial_packet,
  231. .flags= AVFMT_GENERIC_INDEX,
  232. .extensions = "gsm",
  233. .value = CODEC_ID_GSM,
  234. };
  235. #endif
  236. #if CONFIG_H261_MUXER
  237. AVOutputFormat h261_muxer = {
  238. "h261",
  239. NULL_IF_CONFIG_SMALL("raw H.261"),
  240. "video/x-h261",
  241. "h261",
  242. 0,
  243. CODEC_ID_NONE,
  244. CODEC_ID_H261,
  245. NULL,
  246. ff_raw_write_packet,
  247. .flags= AVFMT_NOTIMESTAMPS,
  248. };
  249. #endif
  250. #if CONFIG_H263_MUXER
  251. AVOutputFormat h263_muxer = {
  252. "h263",
  253. NULL_IF_CONFIG_SMALL("raw H.263"),
  254. "video/x-h263",
  255. "h263",
  256. 0,
  257. CODEC_ID_NONE,
  258. CODEC_ID_H263,
  259. NULL,
  260. ff_raw_write_packet,
  261. .flags= AVFMT_NOTIMESTAMPS,
  262. };
  263. #endif
  264. #if CONFIG_H264_MUXER
  265. AVOutputFormat h264_muxer = {
  266. "h264",
  267. NULL_IF_CONFIG_SMALL("raw H.264 video format"),
  268. NULL,
  269. "h264",
  270. 0,
  271. CODEC_ID_NONE,
  272. CODEC_ID_H264,
  273. NULL,
  274. ff_raw_write_packet,
  275. .flags= AVFMT_NOTIMESTAMPS,
  276. };
  277. #endif
  278. #if CONFIG_CAVSVIDEO_MUXER
  279. AVOutputFormat cavsvideo_muxer = {
  280. "cavsvideo",
  281. NULL_IF_CONFIG_SMALL("raw Chinese AVS video"),
  282. NULL,
  283. "cavs",
  284. 0,
  285. CODEC_ID_NONE,
  286. CODEC_ID_CAVS,
  287. NULL,
  288. ff_raw_write_packet,
  289. .flags= AVFMT_NOTIMESTAMPS,
  290. };
  291. #endif
  292. #if CONFIG_M4V_MUXER
  293. AVOutputFormat m4v_muxer = {
  294. "m4v",
  295. NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
  296. NULL,
  297. "m4v",
  298. 0,
  299. CODEC_ID_NONE,
  300. CODEC_ID_MPEG4,
  301. NULL,
  302. ff_raw_write_packet,
  303. .flags= AVFMT_NOTIMESTAMPS,
  304. };
  305. #endif
  306. #if CONFIG_MJPEG_DEMUXER
  307. AVInputFormat mjpeg_demuxer = {
  308. "mjpeg",
  309. NULL_IF_CONFIG_SMALL("raw MJPEG video"),
  310. 0,
  311. NULL,
  312. ff_raw_video_read_header,
  313. ff_raw_read_partial_packet,
  314. .flags= AVFMT_GENERIC_INDEX,
  315. .extensions = "mjpg,mjpeg",
  316. .value = CODEC_ID_MJPEG,
  317. };
  318. #endif
  319. #if CONFIG_MJPEG_MUXER
  320. AVOutputFormat mjpeg_muxer = {
  321. "mjpeg",
  322. NULL_IF_CONFIG_SMALL("raw MJPEG video"),
  323. "video/x-mjpeg",
  324. "mjpg,mjpeg",
  325. 0,
  326. CODEC_ID_NONE,
  327. CODEC_ID_MJPEG,
  328. NULL,
  329. ff_raw_write_packet,
  330. .flags= AVFMT_NOTIMESTAMPS,
  331. };
  332. #endif
  333. #if CONFIG_MLP_DEMUXER
  334. AVInputFormat mlp_demuxer = {
  335. "mlp",
  336. NULL_IF_CONFIG_SMALL("raw MLP"),
  337. 0,
  338. NULL,
  339. ff_raw_audio_read_header,
  340. ff_raw_read_partial_packet,
  341. .flags= AVFMT_GENERIC_INDEX,
  342. .extensions = "mlp",
  343. .value = CODEC_ID_MLP,
  344. };
  345. #endif
  346. #if CONFIG_MLP_MUXER
  347. AVOutputFormat mlp_muxer = {
  348. "mlp",
  349. NULL_IF_CONFIG_SMALL("raw MLP"),
  350. NULL,
  351. "mlp",
  352. 0,
  353. CODEC_ID_MLP,
  354. CODEC_ID_NONE,
  355. NULL,
  356. ff_raw_write_packet,
  357. .flags= AVFMT_NOTIMESTAMPS,
  358. };
  359. #endif
  360. #if CONFIG_SRT_MUXER
  361. AVOutputFormat srt_muxer = {
  362. .name = "srt",
  363. .long_name = NULL_IF_CONFIG_SMALL("SubRip subtitle format"),
  364. .mime_type = "application/x-subrip",
  365. .extensions = "srt",
  366. .write_packet = ff_raw_write_packet,
  367. .flags = AVFMT_NOTIMESTAMPS,
  368. .subtitle_codec = CODEC_ID_SRT,
  369. };
  370. #endif
  371. #if CONFIG_TRUEHD_DEMUXER
  372. AVInputFormat truehd_demuxer = {
  373. "truehd",
  374. NULL_IF_CONFIG_SMALL("raw TrueHD"),
  375. 0,
  376. NULL,
  377. ff_raw_audio_read_header,
  378. ff_raw_read_partial_packet,
  379. .flags= AVFMT_GENERIC_INDEX,
  380. .extensions = "thd",
  381. .value = CODEC_ID_TRUEHD,
  382. };
  383. #endif
  384. #if CONFIG_TRUEHD_MUXER
  385. AVOutputFormat truehd_muxer = {
  386. "truehd",
  387. NULL_IF_CONFIG_SMALL("raw TrueHD"),
  388. NULL,
  389. "thd",
  390. 0,
  391. CODEC_ID_TRUEHD,
  392. CODEC_ID_NONE,
  393. NULL,
  394. ff_raw_write_packet,
  395. .flags= AVFMT_NOTIMESTAMPS,
  396. };
  397. #endif
  398. #if CONFIG_MPEG1VIDEO_MUXER
  399. AVOutputFormat mpeg1video_muxer = {
  400. "mpeg1video",
  401. NULL_IF_CONFIG_SMALL("raw MPEG-1 video"),
  402. "video/x-mpeg",
  403. "mpg,mpeg,m1v",
  404. 0,
  405. CODEC_ID_NONE,
  406. CODEC_ID_MPEG1VIDEO,
  407. NULL,
  408. ff_raw_write_packet,
  409. .flags= AVFMT_NOTIMESTAMPS,
  410. };
  411. #endif
  412. #if CONFIG_MPEG2VIDEO_MUXER
  413. AVOutputFormat mpeg2video_muxer = {
  414. "mpeg2video",
  415. NULL_IF_CONFIG_SMALL("raw MPEG-2 video"),
  416. NULL,
  417. "m2v",
  418. 0,
  419. CODEC_ID_NONE,
  420. CODEC_ID_MPEG2VIDEO,
  421. NULL,
  422. ff_raw_write_packet,
  423. .flags= AVFMT_NOTIMESTAMPS,
  424. };
  425. #endif
  426. #if CONFIG_RAWVIDEO_DEMUXER
  427. AVInputFormat rawvideo_demuxer = {
  428. "rawvideo",
  429. NULL_IF_CONFIG_SMALL("raw video format"),
  430. 0,
  431. NULL,
  432. ff_raw_read_header,
  433. rawvideo_read_packet,
  434. .flags= AVFMT_GENERIC_INDEX,
  435. .extensions = "yuv,cif,qcif,rgb",
  436. .value = CODEC_ID_RAWVIDEO,
  437. };
  438. #endif
  439. #if CONFIG_RAWVIDEO_MUXER
  440. AVOutputFormat rawvideo_muxer = {
  441. "rawvideo",
  442. NULL_IF_CONFIG_SMALL("raw video format"),
  443. NULL,
  444. "yuv,rgb",
  445. 0,
  446. CODEC_ID_NONE,
  447. CODEC_ID_RAWVIDEO,
  448. NULL,
  449. ff_raw_write_packet,
  450. .flags= AVFMT_NOTIMESTAMPS,
  451. };
  452. #endif
  453. #if CONFIG_SHORTEN_DEMUXER
  454. AVInputFormat shorten_demuxer = {
  455. "shn",
  456. NULL_IF_CONFIG_SMALL("raw Shorten"),
  457. 0,
  458. NULL,
  459. ff_raw_audio_read_header,
  460. ff_raw_read_partial_packet,
  461. .flags= AVFMT_GENERIC_INDEX,
  462. .extensions = "shn",
  463. .value = CODEC_ID_SHORTEN,
  464. };
  465. #endif
  466. #if CONFIG_VC1_DEMUXER
  467. AVInputFormat vc1_demuxer = {
  468. "vc1",
  469. NULL_IF_CONFIG_SMALL("raw VC-1"),
  470. 0,
  471. NULL /* vc1_probe */,
  472. ff_raw_video_read_header,
  473. ff_raw_read_partial_packet,
  474. .extensions = "vc1",
  475. .value = CODEC_ID_VC1,
  476. };
  477. #endif