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.

487 lines
11KB

  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. int ff_raw_audio_read_header(AVFormatContext *s,
  93. AVFormatParameters *ap)
  94. {
  95. AVStream *st = av_new_stream(s, 0);
  96. if (!st)
  97. return AVERROR(ENOMEM);
  98. st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  99. st->codec->codec_id = s->iformat->value;
  100. st->need_parsing = AVSTREAM_PARSE_FULL;
  101. /* the parameters will be extracted from the compressed bitstream */
  102. return 0;
  103. }
  104. /* MPEG-1/H.263 input */
  105. int ff_raw_video_read_header(AVFormatContext *s,
  106. AVFormatParameters *ap)
  107. {
  108. AVStream *st;
  109. st = av_new_stream(s, 0);
  110. if (!st)
  111. return AVERROR(ENOMEM);
  112. st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
  113. st->codec->codec_id = s->iformat->value;
  114. st->need_parsing = AVSTREAM_PARSE_FULL;
  115. /* for MJPEG, specify frame rate */
  116. /* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
  117. if (ap->time_base.num) {
  118. st->codec->time_base= ap->time_base;
  119. } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
  120. st->codec->codec_id == CODEC_ID_MPEG4 ||
  121. st->codec->codec_id == CODEC_ID_DIRAC ||
  122. st->codec->codec_id == CODEC_ID_DNXHD ||
  123. st->codec->codec_id == CODEC_ID_VC1 ||
  124. st->codec->codec_id == CODEC_ID_H264) {
  125. st->codec->time_base= (AVRational){1,25};
  126. }
  127. av_set_pts_info(st, 64, 1, 1200000);
  128. return 0;
  129. }
  130. #endif
  131. /* Note: Do not forget to add new entries to the Makefile as well. */
  132. #if CONFIG_AC3_MUXER
  133. AVOutputFormat ac3_muxer = {
  134. "ac3",
  135. NULL_IF_CONFIG_SMALL("raw AC-3"),
  136. "audio/x-ac3",
  137. "ac3",
  138. 0,
  139. CODEC_ID_AC3,
  140. CODEC_ID_NONE,
  141. NULL,
  142. ff_raw_write_packet,
  143. .flags= AVFMT_NOTIMESTAMPS,
  144. };
  145. #endif
  146. #if CONFIG_DIRAC_MUXER
  147. AVOutputFormat dirac_muxer = {
  148. "dirac",
  149. NULL_IF_CONFIG_SMALL("raw Dirac"),
  150. NULL,
  151. "drc",
  152. 0,
  153. CODEC_ID_NONE,
  154. CODEC_ID_DIRAC,
  155. NULL,
  156. ff_raw_write_packet,
  157. .flags= AVFMT_NOTIMESTAMPS,
  158. };
  159. #endif
  160. #if CONFIG_DNXHD_MUXER
  161. AVOutputFormat dnxhd_muxer = {
  162. "dnxhd",
  163. NULL_IF_CONFIG_SMALL("raw DNxHD (SMPTE VC-3)"),
  164. NULL,
  165. "dnxhd",
  166. 0,
  167. CODEC_ID_NONE,
  168. CODEC_ID_DNXHD,
  169. NULL,
  170. ff_raw_write_packet,
  171. .flags= AVFMT_NOTIMESTAMPS,
  172. };
  173. #endif
  174. #if CONFIG_DTS_MUXER
  175. AVOutputFormat dts_muxer = {
  176. "dts",
  177. NULL_IF_CONFIG_SMALL("raw DTS"),
  178. "audio/x-dca",
  179. "dts",
  180. 0,
  181. CODEC_ID_DTS,
  182. CODEC_ID_NONE,
  183. NULL,
  184. ff_raw_write_packet,
  185. .flags= AVFMT_NOTIMESTAMPS,
  186. };
  187. #endif
  188. #if CONFIG_EAC3_MUXER
  189. AVOutputFormat eac3_muxer = {
  190. "eac3",
  191. NULL_IF_CONFIG_SMALL("raw E-AC-3"),
  192. "audio/x-eac3",
  193. "eac3",
  194. 0,
  195. CODEC_ID_EAC3,
  196. CODEC_ID_NONE,
  197. NULL,
  198. ff_raw_write_packet,
  199. .flags= AVFMT_NOTIMESTAMPS,
  200. };
  201. #endif
  202. #if CONFIG_GSM_DEMUXER
  203. AVInputFormat gsm_demuxer = {
  204. "gsm",
  205. NULL_IF_CONFIG_SMALL("raw GSM"),
  206. 0,
  207. NULL,
  208. ff_raw_audio_read_header,
  209. ff_raw_read_partial_packet,
  210. .flags= AVFMT_GENERIC_INDEX,
  211. .extensions = "gsm",
  212. .value = CODEC_ID_GSM,
  213. };
  214. #endif
  215. #if CONFIG_H261_MUXER
  216. AVOutputFormat h261_muxer = {
  217. "h261",
  218. NULL_IF_CONFIG_SMALL("raw H.261"),
  219. "video/x-h261",
  220. "h261",
  221. 0,
  222. CODEC_ID_NONE,
  223. CODEC_ID_H261,
  224. NULL,
  225. ff_raw_write_packet,
  226. .flags= AVFMT_NOTIMESTAMPS,
  227. };
  228. #endif
  229. #if CONFIG_H263_MUXER
  230. AVOutputFormat h263_muxer = {
  231. "h263",
  232. NULL_IF_CONFIG_SMALL("raw H.263"),
  233. "video/x-h263",
  234. "h263",
  235. 0,
  236. CODEC_ID_NONE,
  237. CODEC_ID_H263,
  238. NULL,
  239. ff_raw_write_packet,
  240. .flags= AVFMT_NOTIMESTAMPS,
  241. };
  242. #endif
  243. #if CONFIG_H264_MUXER
  244. AVOutputFormat h264_muxer = {
  245. "h264",
  246. NULL_IF_CONFIG_SMALL("raw H.264 video format"),
  247. NULL,
  248. "h264",
  249. 0,
  250. CODEC_ID_NONE,
  251. CODEC_ID_H264,
  252. NULL,
  253. ff_raw_write_packet,
  254. .flags= AVFMT_NOTIMESTAMPS,
  255. };
  256. #endif
  257. #if CONFIG_CAVSVIDEO_MUXER
  258. AVOutputFormat cavsvideo_muxer = {
  259. "cavsvideo",
  260. NULL_IF_CONFIG_SMALL("raw Chinese AVS video"),
  261. NULL,
  262. "cavs",
  263. 0,
  264. CODEC_ID_NONE,
  265. CODEC_ID_CAVS,
  266. NULL,
  267. ff_raw_write_packet,
  268. .flags= AVFMT_NOTIMESTAMPS,
  269. };
  270. #endif
  271. #if CONFIG_M4V_MUXER
  272. AVOutputFormat m4v_muxer = {
  273. "m4v",
  274. NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
  275. NULL,
  276. "m4v",
  277. 0,
  278. CODEC_ID_NONE,
  279. CODEC_ID_MPEG4,
  280. NULL,
  281. ff_raw_write_packet,
  282. .flags= AVFMT_NOTIMESTAMPS,
  283. };
  284. #endif
  285. #if CONFIG_MJPEG_DEMUXER
  286. AVInputFormat mjpeg_demuxer = {
  287. "mjpeg",
  288. NULL_IF_CONFIG_SMALL("raw MJPEG video"),
  289. 0,
  290. NULL,
  291. ff_raw_video_read_header,
  292. ff_raw_read_partial_packet,
  293. .flags= AVFMT_GENERIC_INDEX,
  294. .extensions = "mjpg,mjpeg",
  295. .value = CODEC_ID_MJPEG,
  296. };
  297. #endif
  298. #if CONFIG_MJPEG_MUXER
  299. AVOutputFormat mjpeg_muxer = {
  300. "mjpeg",
  301. NULL_IF_CONFIG_SMALL("raw MJPEG video"),
  302. "video/x-mjpeg",
  303. "mjpg,mjpeg",
  304. 0,
  305. CODEC_ID_NONE,
  306. CODEC_ID_MJPEG,
  307. NULL,
  308. ff_raw_write_packet,
  309. .flags= AVFMT_NOTIMESTAMPS,
  310. };
  311. #endif
  312. #if CONFIG_MLP_DEMUXER
  313. AVInputFormat mlp_demuxer = {
  314. "mlp",
  315. NULL_IF_CONFIG_SMALL("raw MLP"),
  316. 0,
  317. NULL,
  318. ff_raw_audio_read_header,
  319. ff_raw_read_partial_packet,
  320. .flags= AVFMT_GENERIC_INDEX,
  321. .extensions = "mlp",
  322. .value = CODEC_ID_MLP,
  323. };
  324. #endif
  325. #if CONFIG_MLP_MUXER
  326. AVOutputFormat mlp_muxer = {
  327. "mlp",
  328. NULL_IF_CONFIG_SMALL("raw MLP"),
  329. NULL,
  330. "mlp",
  331. 0,
  332. CODEC_ID_MLP,
  333. CODEC_ID_NONE,
  334. NULL,
  335. ff_raw_write_packet,
  336. .flags= AVFMT_NOTIMESTAMPS,
  337. };
  338. #endif
  339. #if CONFIG_SRT_MUXER
  340. AVOutputFormat srt_muxer = {
  341. .name = "srt",
  342. .long_name = NULL_IF_CONFIG_SMALL("SubRip subtitle format"),
  343. .mime_type = "application/x-subrip",
  344. .extensions = "srt",
  345. .write_packet = ff_raw_write_packet,
  346. .flags = AVFMT_NOTIMESTAMPS,
  347. .subtitle_codec = CODEC_ID_SRT,
  348. };
  349. #endif
  350. #if CONFIG_TRUEHD_DEMUXER
  351. AVInputFormat truehd_demuxer = {
  352. "truehd",
  353. NULL_IF_CONFIG_SMALL("raw TrueHD"),
  354. 0,
  355. NULL,
  356. ff_raw_audio_read_header,
  357. ff_raw_read_partial_packet,
  358. .flags= AVFMT_GENERIC_INDEX,
  359. .extensions = "thd",
  360. .value = CODEC_ID_TRUEHD,
  361. };
  362. #endif
  363. #if CONFIG_TRUEHD_MUXER
  364. AVOutputFormat truehd_muxer = {
  365. "truehd",
  366. NULL_IF_CONFIG_SMALL("raw TrueHD"),
  367. NULL,
  368. "thd",
  369. 0,
  370. CODEC_ID_TRUEHD,
  371. CODEC_ID_NONE,
  372. NULL,
  373. ff_raw_write_packet,
  374. .flags= AVFMT_NOTIMESTAMPS,
  375. };
  376. #endif
  377. #if CONFIG_MPEG1VIDEO_MUXER
  378. AVOutputFormat mpeg1video_muxer = {
  379. "mpeg1video",
  380. NULL_IF_CONFIG_SMALL("raw MPEG-1 video"),
  381. "video/x-mpeg",
  382. "mpg,mpeg,m1v",
  383. 0,
  384. CODEC_ID_NONE,
  385. CODEC_ID_MPEG1VIDEO,
  386. NULL,
  387. ff_raw_write_packet,
  388. .flags= AVFMT_NOTIMESTAMPS,
  389. };
  390. #endif
  391. #if CONFIG_MPEG2VIDEO_MUXER
  392. AVOutputFormat mpeg2video_muxer = {
  393. "mpeg2video",
  394. NULL_IF_CONFIG_SMALL("raw MPEG-2 video"),
  395. NULL,
  396. "m2v",
  397. 0,
  398. CODEC_ID_NONE,
  399. CODEC_ID_MPEG2VIDEO,
  400. NULL,
  401. ff_raw_write_packet,
  402. .flags= AVFMT_NOTIMESTAMPS,
  403. };
  404. #endif
  405. #if CONFIG_RAWVIDEO_MUXER
  406. AVOutputFormat rawvideo_muxer = {
  407. "rawvideo",
  408. NULL_IF_CONFIG_SMALL("raw video format"),
  409. NULL,
  410. "yuv,rgb",
  411. 0,
  412. CODEC_ID_NONE,
  413. CODEC_ID_RAWVIDEO,
  414. NULL,
  415. ff_raw_write_packet,
  416. .flags= AVFMT_NOTIMESTAMPS,
  417. };
  418. #endif
  419. #if CONFIG_SHORTEN_DEMUXER
  420. AVInputFormat shorten_demuxer = {
  421. "shn",
  422. NULL_IF_CONFIG_SMALL("raw Shorten"),
  423. 0,
  424. NULL,
  425. ff_raw_audio_read_header,
  426. ff_raw_read_partial_packet,
  427. .flags= AVFMT_GENERIC_INDEX,
  428. .extensions = "shn",
  429. .value = CODEC_ID_SHORTEN,
  430. };
  431. #endif
  432. #if CONFIG_VC1_DEMUXER
  433. AVInputFormat vc1_demuxer = {
  434. "vc1",
  435. NULL_IF_CONFIG_SMALL("raw VC-1"),
  436. 0,
  437. NULL /* vc1_probe */,
  438. ff_raw_video_read_header,
  439. ff_raw_read_partial_packet,
  440. .extensions = "vc1",
  441. .value = CODEC_ID_VC1,
  442. };
  443. #endif