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.

411 lines
11KB

  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);
  107. if (!unit_data)
  108. return AVERROR(ENOMEM);
  109. memcpy(unit_data, start - 1, unit_size);
  110. err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type,
  111. unit_data, unit_size);
  112. if (err < 0) {
  113. av_freep(&unit_data);
  114. return err;
  115. }
  116. if (end == frag->data + frag->data_size)
  117. break;
  118. start_code = next_start_code;
  119. start = end;
  120. }
  121. return 0;
  122. }
  123. static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx,
  124. CodedBitstreamUnit *unit)
  125. {
  126. BitstreamContext bc;
  127. int err;
  128. err = bitstream_init(&bc, unit->data, 8 * unit->data_size);
  129. if (err < 0)
  130. return err;
  131. if (MPEG2_START_IS_SLICE(unit->type)) {
  132. MPEG2RawSlice *slice;
  133. int pos, len;
  134. slice = av_mallocz(sizeof(*slice));
  135. if (!slice)
  136. return AVERROR(ENOMEM);
  137. err = cbs_mpeg2_read_slice_header(ctx, &bc, &slice->header);
  138. if (err < 0) {
  139. av_free(slice);
  140. return err;
  141. }
  142. pos = bitstream_tell(&bc);
  143. len = unit->data_size;
  144. slice->data_size = len - pos / 8;
  145. slice->data = av_malloc(slice->data_size);
  146. if (!slice->data) {
  147. av_free(slice);
  148. return AVERROR(ENOMEM);
  149. }
  150. memcpy(slice->data,
  151. unit->data + pos / 8, slice->data_size);
  152. slice->data_bit_start = pos % 8;
  153. unit->content = slice;
  154. } else {
  155. switch (unit->type) {
  156. #define START(start_code, type, func) \
  157. case start_code: \
  158. { \
  159. type *header; \
  160. header = av_mallocz(sizeof(*header)); \
  161. if (!header) \
  162. return AVERROR(ENOMEM); \
  163. err = cbs_mpeg2_read_ ## func(ctx, &bc, header); \
  164. if (err < 0) { \
  165. av_free(header); \
  166. return err; \
  167. } \
  168. unit->content = header; \
  169. } \
  170. break;
  171. START(0x00, MPEG2RawPictureHeader, picture_header);
  172. START(0xb2, MPEG2RawUserData, user_data);
  173. START(0xb3, MPEG2RawSequenceHeader, sequence_header);
  174. START(0xb5, MPEG2RawExtensionData, extension_data);
  175. START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
  176. #undef START
  177. default:
  178. av_log(ctx->log_ctx, AV_LOG_ERROR, "Unknown start code %02x.\n",
  179. unit->type);
  180. return AVERROR_INVALIDDATA;
  181. }
  182. }
  183. return 0;
  184. }
  185. static int cbs_mpeg2_write_header(CodedBitstreamContext *ctx,
  186. CodedBitstreamUnit *unit,
  187. PutBitContext *pbc)
  188. {
  189. int err;
  190. switch (unit->type) {
  191. #define START(start_code, type, func) \
  192. case start_code: \
  193. err = cbs_mpeg2_write_ ## func(ctx, pbc, unit->content); \
  194. break;
  195. START(0x00, MPEG2RawPictureHeader, picture_header);
  196. START(0xb2, MPEG2RawUserData, user_data);
  197. START(0xb3, MPEG2RawSequenceHeader, sequence_header);
  198. START(0xb5, MPEG2RawExtensionData, extension_data);
  199. START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
  200. #undef START
  201. default:
  202. av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for start "
  203. "code %02x.\n", unit->type);
  204. return AVERROR_PATCHWELCOME;
  205. }
  206. return err;
  207. }
  208. static int cbs_mpeg2_write_slice(CodedBitstreamContext *ctx,
  209. CodedBitstreamUnit *unit,
  210. PutBitContext *pbc)
  211. {
  212. MPEG2RawSlice *slice = unit->content;
  213. BitstreamContext bc;
  214. size_t bits_left;
  215. int err;
  216. err = cbs_mpeg2_write_slice_header(ctx, pbc, &slice->header);
  217. if (err < 0)
  218. return err;
  219. if (slice->data) {
  220. if (slice->data_size * 8 + 8 > put_bits_left(pbc))
  221. return AVERROR(ENOSPC);
  222. bitstream_init(&bc, slice->data, slice->data_size * 8);
  223. bitstream_skip(&bc, slice->data_bit_start);
  224. while (bitstream_bits_left(&bc) > 15)
  225. put_bits(pbc, 16, bitstream_read(&bc, 16));
  226. bits_left = bitstream_bits_left(&bc);
  227. put_bits(pbc, bits_left, bitstream_read(&bc, bits_left));
  228. // Align with zeroes.
  229. while (put_bits_count(pbc) % 8 != 0)
  230. put_bits(pbc, 1, 0);
  231. }
  232. return 0;
  233. }
  234. static int cbs_mpeg2_write_unit(CodedBitstreamContext *ctx,
  235. CodedBitstreamUnit *unit)
  236. {
  237. CodedBitstreamMPEG2Context *priv = ctx->priv_data;
  238. PutBitContext pbc;
  239. int err;
  240. if (!priv->write_buffer) {
  241. // Initial write buffer size is 1MB.
  242. priv->write_buffer_size = 1024 * 1024;
  243. reallocate_and_try_again:
  244. err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
  245. if (err < 0) {
  246. av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
  247. "sufficiently large write buffer (last attempt "
  248. "%zu bytes).\n", priv->write_buffer_size);
  249. return err;
  250. }
  251. }
  252. init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
  253. if (unit->type >= 0x01 && unit->type <= 0xaf)
  254. err = cbs_mpeg2_write_slice(ctx, unit, &pbc);
  255. else
  256. err = cbs_mpeg2_write_header(ctx, unit, &pbc);
  257. if (err == AVERROR(ENOSPC)) {
  258. // Overflow.
  259. priv->write_buffer_size *= 2;
  260. goto reallocate_and_try_again;
  261. }
  262. if (err < 0) {
  263. // Write failed for some other reason.
  264. return err;
  265. }
  266. if (put_bits_count(&pbc) % 8)
  267. unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
  268. else
  269. unit->data_bit_padding = 0;
  270. unit->data_size = (put_bits_count(&pbc) + 7) / 8;
  271. flush_put_bits(&pbc);
  272. err = av_reallocp(&unit->data, unit->data_size);
  273. if (err < 0)
  274. return err;
  275. memcpy(unit->data, priv->write_buffer, unit->data_size);
  276. return 0;
  277. }
  278. static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx,
  279. CodedBitstreamFragment *frag)
  280. {
  281. uint8_t *data;
  282. size_t size, dp, sp;
  283. int i;
  284. size = 0;
  285. for (i = 0; i < frag->nb_units; i++)
  286. size += 3 + frag->units[i].data_size;
  287. data = av_malloc(size);
  288. if (!data)
  289. return AVERROR(ENOMEM);
  290. dp = 0;
  291. for (i = 0; i < frag->nb_units; i++) {
  292. CodedBitstreamUnit *unit = &frag->units[i];
  293. data[dp++] = 0;
  294. data[dp++] = 0;
  295. data[dp++] = 1;
  296. for (sp = 0; sp < unit->data_size; sp++)
  297. data[dp++] = unit->data[sp];
  298. }
  299. av_assert0(dp == size);
  300. frag->data = data;
  301. frag->data_size = size;
  302. return 0;
  303. }
  304. static void cbs_mpeg2_free_unit(CodedBitstreamUnit *unit)
  305. {
  306. if (MPEG2_START_IS_SLICE(unit->type)) {
  307. MPEG2RawSlice *slice = unit->content;
  308. av_freep(&slice->data);
  309. av_freep(&slice->header.extra_information);
  310. } else if (unit->type == MPEG2_START_USER_DATA) {
  311. MPEG2RawUserData *user = unit->content;
  312. av_freep(&user->user_data);
  313. }
  314. av_freep(&unit->content);
  315. }
  316. static void cbs_mpeg2_close(CodedBitstreamContext *ctx)
  317. {
  318. CodedBitstreamMPEG2Context *priv = ctx->priv_data;
  319. av_freep(&priv->write_buffer);
  320. }
  321. const CodedBitstreamType ff_cbs_type_mpeg2 = {
  322. .codec_id = AV_CODEC_ID_MPEG2VIDEO,
  323. .priv_data_size = sizeof(CodedBitstreamMPEG2Context),
  324. .split_fragment = &cbs_mpeg2_split_fragment,
  325. .read_unit = &cbs_mpeg2_read_unit,
  326. .write_unit = &cbs_mpeg2_write_unit,
  327. .assemble_fragment = &cbs_mpeg2_assemble_fragment,
  328. .free_unit = &cbs_mpeg2_free_unit,
  329. .close = &cbs_mpeg2_close,
  330. };