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.

264 lines
8.0KB

  1. /*
  2. * IEC958 muxer
  3. * Copyright (c) 2009 Bartlomiej Wolowiec
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * IEC-61937 encapsulation of various formats, used by S/PDIF
  24. * @author Bartlomiej Wolowiec
  25. */
  26. /*
  27. * Terminology used in specification:
  28. * data-burst - IEC958 frame, contains header and encapsuled frame
  29. * burst-preambule - IEC958 frame header, contains 16-bits words named Pa, Pb, Pc and Pd
  30. * burst-payload - encapsuled frame
  31. * Pa, Pb - syncword - 0xF872, 0x4E1F
  32. * Pc - burst-info, contains data-type (bits 0-6), error flag (bit 7), data-type-dependent info (bits 8-12)
  33. * and bitstream number (bits 13-15)
  34. * data-type - determines type of encapsuled frames
  35. * Pd - length code (number of bits or bytes of encapsuled frame - according to data_type)
  36. *
  37. * IEC958 frames at normal usage start every specific count of bytes,
  38. * dependent from data-type (spaces between packets are filled by zeros)
  39. */
  40. #include "avformat.h"
  41. #include "spdif.h"
  42. #include "libavcodec/ac3.h"
  43. #include "libavcodec/dca.h"
  44. #include "libavcodec/aacadtsdec.h"
  45. typedef struct IEC958Context {
  46. enum IEC958DataType data_type; ///< burst info - reference to type of payload of the data-burst
  47. int pkt_size; ///< length code in bits
  48. int pkt_offset; ///< data burst repetition period in bytes
  49. uint8_t *buffer; ///< allocated buffer, used for swap bytes
  50. int buffer_size; ///< size of allocated buffer
  51. /// function, which generates codec dependent header information.
  52. /// Sets data_type and data_offset
  53. int (*header_info) (AVFormatContext *s, AVPacket *pkt);
  54. } IEC958Context;
  55. static int spdif_header_ac3(AVFormatContext *s, AVPacket *pkt)
  56. {
  57. IEC958Context *ctx = s->priv_data;
  58. int bitstream_mode = pkt->data[6] & 0x7;
  59. ctx->data_type = IEC958_AC3 | (bitstream_mode << 8);
  60. ctx->pkt_offset = AC3_FRAME_SIZE << 2;
  61. return 0;
  62. }
  63. static int spdif_header_dts(AVFormatContext *s, AVPacket *pkt)
  64. {
  65. IEC958Context *ctx = s->priv_data;
  66. uint32_t syncword_dts = AV_RB32(pkt->data);
  67. int blocks;
  68. switch (syncword_dts) {
  69. case DCA_MARKER_RAW_BE:
  70. blocks = (AV_RB16(pkt->data + 4) >> 2) & 0x7f;
  71. break;
  72. case DCA_MARKER_RAW_LE:
  73. blocks = (AV_RL16(pkt->data + 4) >> 2) & 0x7f;
  74. break;
  75. case DCA_MARKER_14B_BE:
  76. blocks =
  77. (((pkt->data[5] & 0x07) << 4) | ((pkt->data[6] & 0x3f) >> 2));
  78. break;
  79. case DCA_MARKER_14B_LE:
  80. blocks =
  81. (((pkt->data[4] & 0x07) << 4) | ((pkt->data[7] & 0x3f) >> 2));
  82. break;
  83. default:
  84. av_log(s, AV_LOG_ERROR, "bad DTS syncword 0x%x\n", syncword_dts);
  85. return -1;
  86. }
  87. blocks++;
  88. switch (blocks) {
  89. case 512 >> 5: ctx->data_type = IEC958_DTS1; break;
  90. case 1024 >> 5: ctx->data_type = IEC958_DTS2; break;
  91. case 2048 >> 5: ctx->data_type = IEC958_DTS3; break;
  92. default:
  93. av_log(s, AV_LOG_ERROR, "%i samples in DTS frame not supported\n",
  94. blocks << 5);
  95. return -1;
  96. }
  97. ctx->pkt_offset = blocks << 7;
  98. return 0;
  99. }
  100. static const enum IEC958DataType mpeg_data_type[2][3] = {
  101. // LAYER1 LAYER2 LAYER3
  102. { IEC958_MPEG2_LAYER1_LSF, IEC958_MPEG2_LAYER2_LSF, IEC958_MPEG2_LAYER3_LSF }, //MPEG2 LSF
  103. { IEC958_MPEG1_LAYER1, IEC958_MPEG1_LAYER23, IEC958_MPEG1_LAYER23 }, //MPEG1
  104. };
  105. static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
  106. {
  107. IEC958Context *ctx = s->priv_data;
  108. int version = (pkt->data[1] >> 3) & 3;
  109. int layer = 3 - ((pkt->data[1] >> 1) & 3);
  110. int extension = pkt->data[2] & 1;
  111. if (layer == 3 || version == 1) {
  112. av_log(s, AV_LOG_ERROR, "Wrong MPEG file format\n");
  113. return -1;
  114. }
  115. av_log(s, AV_LOG_DEBUG, "version: %i layer: %i extension: %i\n", version, layer, extension);
  116. if (version == 2 && extension) {
  117. ctx->data_type = IEC958_MPEG2_EXT;
  118. ctx->pkt_offset = 4608;
  119. } else {
  120. ctx->data_type = mpeg_data_type [version & 1][layer];
  121. ctx->pkt_offset = spdif_mpeg_pkt_offset[version & 1][layer];
  122. }
  123. // TODO Data type dependant info (normal/karaoke, dynamic range control)
  124. return 0;
  125. }
  126. static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
  127. {
  128. IEC958Context *ctx = s->priv_data;
  129. AACADTSHeaderInfo hdr;
  130. GetBitContext gbc;
  131. int ret;
  132. init_get_bits(&gbc, pkt->data, AAC_ADTS_HEADER_SIZE * 8);
  133. ret = ff_aac_parse_header(&gbc, &hdr);
  134. if (ret < 0) {
  135. av_log(s, AV_LOG_ERROR, "Wrong AAC file format\n");
  136. return -1;
  137. }
  138. ctx->pkt_offset = hdr.samples << 2;
  139. switch (hdr.num_aac_frames) {
  140. case 1:
  141. ctx->data_type = IEC958_MPEG2_AAC;
  142. break;
  143. case 2:
  144. ctx->data_type = IEC958_MPEG2_AAC_LSF_2048;
  145. break;
  146. case 4:
  147. ctx->data_type = IEC958_MPEG2_AAC_LSF_4096;
  148. break;
  149. default:
  150. av_log(s, AV_LOG_ERROR, "%i samples in AAC frame not supported\n",
  151. hdr.samples);
  152. return -1;
  153. }
  154. //TODO Data type dependent info (LC profile/SBR)
  155. return 0;
  156. }
  157. static int spdif_write_header(AVFormatContext *s)
  158. {
  159. IEC958Context *ctx = s->priv_data;
  160. switch (s->streams[0]->codec->codec_id) {
  161. case CODEC_ID_AC3:
  162. ctx->header_info = spdif_header_ac3;
  163. break;
  164. case CODEC_ID_MP1:
  165. case CODEC_ID_MP2:
  166. case CODEC_ID_MP3:
  167. ctx->header_info = spdif_header_mpeg;
  168. break;
  169. case CODEC_ID_DTS:
  170. ctx->header_info = spdif_header_dts;
  171. break;
  172. case CODEC_ID_AAC:
  173. ctx->header_info = spdif_header_aac;
  174. break;
  175. default:
  176. av_log(s, AV_LOG_ERROR, "codec not supported\n");
  177. return -1;
  178. }
  179. return 0;
  180. }
  181. static int spdif_write_trailer(AVFormatContext *s)
  182. {
  183. IEC958Context *ctx = s->priv_data;
  184. av_freep(&ctx->buffer);
  185. return 0;
  186. }
  187. static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
  188. {
  189. IEC958Context *ctx = s->priv_data;
  190. int ret, padding;
  191. ctx->pkt_size = FFALIGN(pkt->size, 2) << 3;
  192. ret = ctx->header_info(s, pkt);
  193. if (ret < 0)
  194. return -1;
  195. padding = (ctx->pkt_offset - BURST_HEADER_SIZE - pkt->size) >> 1;
  196. if (padding < 0) {
  197. av_log(s, AV_LOG_ERROR, "bitrate is too high\n");
  198. return -1;
  199. }
  200. put_le16(s->pb, SYNCWORD1); //Pa
  201. put_le16(s->pb, SYNCWORD2); //Pb
  202. put_le16(s->pb, ctx->data_type); //Pc
  203. put_le16(s->pb, ctx->pkt_size); //Pd
  204. #if HAVE_BIGENDIAN
  205. put_buffer(s->pb, pkt->data, pkt->size & ~1);
  206. #else
  207. av_fast_malloc(&ctx->buffer, &ctx->buffer_size, pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
  208. if (!ctx->buffer)
  209. return AVERROR(ENOMEM);
  210. ff_spdif_bswap_buf16((uint16_t *)ctx->buffer, (uint16_t *)pkt->data, pkt->size >> 1);
  211. put_buffer(s->pb, ctx->buffer, pkt->size & ~1);
  212. #endif
  213. if (pkt->size & 1)
  214. put_be16(s->pb, pkt->data[pkt->size - 1]);
  215. for (; padding > 0; padding--)
  216. put_be16(s->pb, 0);
  217. av_log(s, AV_LOG_DEBUG, "type=%x len=%i pkt_offset=%i\n",
  218. ctx->data_type, pkt->size, ctx->pkt_offset);
  219. put_flush_packet(s->pb);
  220. return 0;
  221. }
  222. AVOutputFormat spdif_muxer = {
  223. "spdif",
  224. NULL_IF_CONFIG_SMALL("IEC958 - S/PDIF (IEC-61937)"),
  225. NULL,
  226. "spdif",
  227. sizeof(IEC958Context),
  228. CODEC_ID_AC3,
  229. CODEC_ID_NONE,
  230. spdif_write_header,
  231. spdif_write_packet,
  232. spdif_write_trailer,
  233. };