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.

412 lines
12KB

  1. /*
  2. * This file is part of Libav.
  3. *
  4. * Libav is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * Libav is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with Libav; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. #include "libavutil/avassert.h"
  19. #include "cbs.h"
  20. #include "cbs_internal.h"
  21. #include "cbs_mpeg2.h"
  22. #include "internal.h"
  23. #define HEADER(name) do { \
  24. ff_cbs_trace_header(ctx, name); \
  25. } while (0)
  26. #define CHECK(call) do { \
  27. err = (call); \
  28. if (err < 0) \
  29. return err; \
  30. } while (0)
  31. #define FUNC_NAME(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
  32. #define FUNC_MPEG2(rw, name) FUNC_NAME(rw, mpeg2, name)
  33. #define FUNC(name) FUNC_MPEG2(READWRITE, name)
  34. #define READ
  35. #define READWRITE read
  36. #define RWContext BitstreamContext
  37. #define xui(width, name, var) do { \
  38. uint32_t value = 0; \
  39. CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
  40. &value, 0, (1 << width) - 1)); \
  41. var = value; \
  42. } while (0)
  43. #define ui(width, name) \
  44. xui(width, name, current->name)
  45. #define marker_bit() do { \
  46. av_unused int one = 1; \
  47. CHECK(ff_cbs_read_unsigned(ctx, rw, 1, "marker_bit", &one, 1, 1)); \
  48. } while (0)
  49. #define nextbits(width, compare, var) \
  50. (bitstream_bits_left(rw) >= width && \
  51. (var = bitstream_peek(rw, width)) == (compare))
  52. #include "cbs_mpeg2_syntax_template.c"
  53. #undef READ
  54. #undef READWRITE
  55. #undef RWContext
  56. #undef xui
  57. #undef ui
  58. #undef marker_bit
  59. #undef nextbits
  60. #define WRITE
  61. #define READWRITE write
  62. #define RWContext PutBitContext
  63. #define xui(width, name, var) do { \
  64. CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
  65. var, 0, (1 << width) - 1)); \
  66. } while (0)
  67. #define ui(width, name) \
  68. xui(width, name, current->name)
  69. #define marker_bit() do { \
  70. CHECK(ff_cbs_write_unsigned(ctx, rw, 1, "marker_bit", 1, 1, 1)); \
  71. } while (0)
  72. #define nextbits(width, compare, var) (var)
  73. #include "cbs_mpeg2_syntax_template.c"
  74. #undef READ
  75. #undef READWRITE
  76. #undef RWContext
  77. #undef xui
  78. #undef ui
  79. #undef marker_bit
  80. #undef nextbits
  81. static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx,
  82. CodedBitstreamFragment *frag,
  83. int header)
  84. {
  85. const uint8_t *start, *end;
  86. uint8_t *unit_data;
  87. uint32_t start_code = -1, next_start_code = -1;
  88. size_t unit_size;
  89. int err, i, unit_type;
  90. start = avpriv_find_start_code(frag->data, frag->data + frag->data_size,
  91. &start_code);
  92. for (i = 0;; i++) {
  93. end = avpriv_find_start_code(start, frag->data + frag->data_size,
  94. &next_start_code);
  95. unit_type = start_code & 0xff;
  96. // The start and end pointers point at to the byte following the
  97. // start_code_identifier in the start code that they found.
  98. if (end == frag->data + frag->data_size) {
  99. // We didn't find a start code, so this is the final unit.
  100. unit_size = end - (start - 1);
  101. } else {
  102. // Unit runs from start to the beginning of the start code
  103. // pointed to by end (including any padding zeroes).
  104. unit_size = (end - 4) - (start - 1);
  105. }
  106. unit_data = av_malloc(unit_size + AV_INPUT_BUFFER_PADDING_SIZE);
  107. if (!unit_data)
  108. return AVERROR(ENOMEM);
  109. memcpy(unit_data, start - 1, unit_size);
  110. memset(unit_data + unit_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
  111. err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type,
  112. unit_data, unit_size);
  113. if (err < 0) {
  114. av_freep(&unit_data);
  115. return err;
  116. }
  117. if (end == frag->data + frag->data_size)
  118. break;
  119. start_code = next_start_code;
  120. start = end;
  121. }
  122. return 0;
  123. }
  124. static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx,
  125. CodedBitstreamUnit *unit)
  126. {
  127. BitstreamContext bc;
  128. int err;
  129. err = bitstream_init(&bc, unit->data, 8 * unit->data_size);
  130. if (err < 0)
  131. return err;
  132. if (MPEG2_START_IS_SLICE(unit->type)) {
  133. MPEG2RawSlice *slice;
  134. int pos, len;
  135. slice = av_mallocz(sizeof(*slice));
  136. if (!slice)
  137. return AVERROR(ENOMEM);
  138. err = cbs_mpeg2_read_slice_header(ctx, &bc, &slice->header);
  139. if (err < 0) {
  140. av_free(slice);
  141. return err;
  142. }
  143. pos = bitstream_tell(&bc);
  144. len = unit->data_size;
  145. slice->data_size = len - pos / 8;
  146. slice->data = av_malloc(slice->data_size);
  147. if (!slice->data) {
  148. av_free(slice);
  149. return AVERROR(ENOMEM);
  150. }
  151. memcpy(slice->data,
  152. unit->data + pos / 8, slice->data_size);
  153. slice->data_bit_start = pos % 8;
  154. unit->content = slice;
  155. } else {
  156. switch (unit->type) {
  157. #define START(start_code, type, func) \
  158. case start_code: \
  159. { \
  160. type *header; \
  161. header = av_mallocz(sizeof(*header)); \
  162. if (!header) \
  163. return AVERROR(ENOMEM); \
  164. err = cbs_mpeg2_read_ ## func(ctx, &bc, header); \
  165. if (err < 0) { \
  166. av_free(header); \
  167. return err; \
  168. } \
  169. unit->content = header; \
  170. } \
  171. break;
  172. START(0x00, MPEG2RawPictureHeader, picture_header);
  173. START(0xb2, MPEG2RawUserData, user_data);
  174. START(0xb3, MPEG2RawSequenceHeader, sequence_header);
  175. START(0xb5, MPEG2RawExtensionData, extension_data);
  176. START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
  177. #undef START
  178. default:
  179. av_log(ctx->log_ctx, AV_LOG_ERROR, "Unknown start code %02x.\n",
  180. unit->type);
  181. return AVERROR_INVALIDDATA;
  182. }
  183. }
  184. return 0;
  185. }
  186. static int cbs_mpeg2_write_header(CodedBitstreamContext *ctx,
  187. CodedBitstreamUnit *unit,
  188. PutBitContext *pbc)
  189. {
  190. int err;
  191. switch (unit->type) {
  192. #define START(start_code, type, func) \
  193. case start_code: \
  194. err = cbs_mpeg2_write_ ## func(ctx, pbc, unit->content); \
  195. break;
  196. START(0x00, MPEG2RawPictureHeader, picture_header);
  197. START(0xb2, MPEG2RawUserData, user_data);
  198. START(0xb3, MPEG2RawSequenceHeader, sequence_header);
  199. START(0xb5, MPEG2RawExtensionData, extension_data);
  200. START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
  201. #undef START
  202. default:
  203. av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for start "
  204. "code %02x.\n", unit->type);
  205. return AVERROR_PATCHWELCOME;
  206. }
  207. return err;
  208. }
  209. static int cbs_mpeg2_write_slice(CodedBitstreamContext *ctx,
  210. CodedBitstreamUnit *unit,
  211. PutBitContext *pbc)
  212. {
  213. MPEG2RawSlice *slice = unit->content;
  214. BitstreamContext bc;
  215. size_t bits_left;
  216. int err;
  217. err = cbs_mpeg2_write_slice_header(ctx, pbc, &slice->header);
  218. if (err < 0)
  219. return err;
  220. if (slice->data) {
  221. if (slice->data_size * 8 + 8 > put_bits_left(pbc))
  222. return AVERROR(ENOSPC);
  223. bitstream_init(&bc, slice->data, slice->data_size * 8);
  224. bitstream_skip(&bc, slice->data_bit_start);
  225. while (bitstream_bits_left(&bc) > 15)
  226. put_bits(pbc, 16, bitstream_read(&bc, 16));
  227. bits_left = bitstream_bits_left(&bc);
  228. put_bits(pbc, bits_left, bitstream_read(&bc, bits_left));
  229. // Align with zeroes.
  230. while (put_bits_count(pbc) % 8 != 0)
  231. put_bits(pbc, 1, 0);
  232. }
  233. return 0;
  234. }
  235. static int cbs_mpeg2_write_unit(CodedBitstreamContext *ctx,
  236. CodedBitstreamUnit *unit)
  237. {
  238. CodedBitstreamMPEG2Context *priv = ctx->priv_data;
  239. PutBitContext pbc;
  240. int err;
  241. if (!priv->write_buffer) {
  242. // Initial write buffer size is 1MB.
  243. priv->write_buffer_size = 1024 * 1024;
  244. reallocate_and_try_again:
  245. err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
  246. if (err < 0) {
  247. av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
  248. "sufficiently large write buffer (last attempt "
  249. "%zu bytes).\n", priv->write_buffer_size);
  250. return err;
  251. }
  252. }
  253. init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
  254. if (unit->type >= 0x01 && unit->type <= 0xaf)
  255. err = cbs_mpeg2_write_slice(ctx, unit, &pbc);
  256. else
  257. err = cbs_mpeg2_write_header(ctx, unit, &pbc);
  258. if (err == AVERROR(ENOSPC)) {
  259. // Overflow.
  260. priv->write_buffer_size *= 2;
  261. goto reallocate_and_try_again;
  262. }
  263. if (err < 0) {
  264. // Write failed for some other reason.
  265. return err;
  266. }
  267. if (put_bits_count(&pbc) % 8)
  268. unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
  269. else
  270. unit->data_bit_padding = 0;
  271. unit->data_size = (put_bits_count(&pbc) + 7) / 8;
  272. flush_put_bits(&pbc);
  273. err = av_reallocp(&unit->data, unit->data_size);
  274. if (err < 0)
  275. return err;
  276. memcpy(unit->data, priv->write_buffer, unit->data_size);
  277. return 0;
  278. }
  279. static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx,
  280. CodedBitstreamFragment *frag)
  281. {
  282. uint8_t *data;
  283. size_t size, dp, sp;
  284. int i;
  285. size = 0;
  286. for (i = 0; i < frag->nb_units; i++)
  287. size += 3 + frag->units[i].data_size;
  288. data = av_malloc(size);
  289. if (!data)
  290. return AVERROR(ENOMEM);
  291. dp = 0;
  292. for (i = 0; i < frag->nb_units; i++) {
  293. CodedBitstreamUnit *unit = &frag->units[i];
  294. data[dp++] = 0;
  295. data[dp++] = 0;
  296. data[dp++] = 1;
  297. for (sp = 0; sp < unit->data_size; sp++)
  298. data[dp++] = unit->data[sp];
  299. }
  300. av_assert0(dp == size);
  301. frag->data = data;
  302. frag->data_size = size;
  303. return 0;
  304. }
  305. static void cbs_mpeg2_free_unit(CodedBitstreamUnit *unit)
  306. {
  307. if (MPEG2_START_IS_SLICE(unit->type)) {
  308. MPEG2RawSlice *slice = unit->content;
  309. av_freep(&slice->data);
  310. av_freep(&slice->header.extra_information);
  311. } else if (unit->type == MPEG2_START_USER_DATA) {
  312. MPEG2RawUserData *user = unit->content;
  313. av_freep(&user->user_data);
  314. }
  315. av_freep(&unit->content);
  316. }
  317. static void cbs_mpeg2_close(CodedBitstreamContext *ctx)
  318. {
  319. CodedBitstreamMPEG2Context *priv = ctx->priv_data;
  320. av_freep(&priv->write_buffer);
  321. }
  322. const CodedBitstreamType ff_cbs_type_mpeg2 = {
  323. .codec_id = AV_CODEC_ID_MPEG2VIDEO,
  324. .priv_data_size = sizeof(CodedBitstreamMPEG2Context),
  325. .split_fragment = &cbs_mpeg2_split_fragment,
  326. .read_unit = &cbs_mpeg2_read_unit,
  327. .write_unit = &cbs_mpeg2_write_unit,
  328. .assemble_fragment = &cbs_mpeg2_assemble_fragment,
  329. .free_unit = &cbs_mpeg2_free_unit,
  330. .close = &cbs_mpeg2_close,
  331. };