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.

410 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) (var = bitstream_peek(rw, width), \
  50. var == (compare))
  51. #include "cbs_mpeg2_syntax_template.c"
  52. #undef READ
  53. #undef READWRITE
  54. #undef RWContext
  55. #undef xui
  56. #undef ui
  57. #undef marker_bit
  58. #undef nextbits
  59. #define WRITE
  60. #define READWRITE write
  61. #define RWContext PutBitContext
  62. #define xui(width, name, var) do { \
  63. CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
  64. var, 0, (1 << width) - 1)); \
  65. } while (0)
  66. #define ui(width, name) \
  67. xui(width, name, current->name)
  68. #define marker_bit() do { \
  69. CHECK(ff_cbs_write_unsigned(ctx, rw, 1, "marker_bit", 1, 1, 1)); \
  70. } while (0)
  71. #define nextbits(width, compare, var) (var)
  72. #include "cbs_mpeg2_syntax_template.c"
  73. #undef READ
  74. #undef READWRITE
  75. #undef RWContext
  76. #undef xui
  77. #undef ui
  78. #undef marker_bit
  79. #undef nextbits
  80. static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx,
  81. CodedBitstreamFragment *frag,
  82. int header)
  83. {
  84. const uint8_t *start, *end;
  85. uint8_t *unit_data;
  86. uint32_t start_code = -1, next_start_code = -1;
  87. size_t unit_size;
  88. int err, i, unit_type;
  89. start = avpriv_find_start_code(frag->data, frag->data + frag->data_size,
  90. &start_code);
  91. for (i = 0;; i++) {
  92. end = avpriv_find_start_code(start, frag->data + frag->data_size,
  93. &next_start_code);
  94. unit_type = start_code & 0xff;
  95. // The start and end pointers point at to the byte following the
  96. // start_code_identifier in the start code that they found.
  97. if (end == frag->data + frag->data_size) {
  98. // We didn't find a start code, so this is the final unit.
  99. unit_size = end - (start - 1);
  100. } else {
  101. // Unit runs from start to the beginning of the start code
  102. // pointed to by end (including any padding zeroes).
  103. unit_size = (end - 4) - (start - 1);
  104. }
  105. unit_data = av_malloc(unit_size);
  106. if (!unit_data)
  107. return AVERROR(ENOMEM);
  108. memcpy(unit_data, start - 1, unit_size);
  109. err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type,
  110. unit_data, unit_size);
  111. if (err < 0) {
  112. av_freep(&unit_data);
  113. return err;
  114. }
  115. if (end == frag->data + frag->data_size)
  116. break;
  117. start_code = next_start_code;
  118. start = end;
  119. }
  120. return 0;
  121. }
  122. static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx,
  123. CodedBitstreamUnit *unit)
  124. {
  125. BitstreamContext bc;
  126. int err;
  127. err = bitstream_init(&bc, unit->data, 8 * unit->data_size);
  128. if (err < 0)
  129. return err;
  130. if (MPEG2_START_IS_SLICE(unit->type)) {
  131. MPEG2RawSlice *slice;
  132. int pos, len;
  133. slice = av_mallocz(sizeof(*slice));
  134. if (!slice)
  135. return AVERROR(ENOMEM);
  136. err = cbs_mpeg2_read_slice_header(ctx, &bc, &slice->header);
  137. if (err < 0) {
  138. av_free(slice);
  139. return err;
  140. }
  141. pos = bitstream_tell(&bc);
  142. len = unit->data_size;
  143. slice->data_size = len - pos / 8;
  144. slice->data = av_malloc(slice->data_size);
  145. if (!slice->data) {
  146. av_free(slice);
  147. return AVERROR(ENOMEM);
  148. }
  149. memcpy(slice->data,
  150. unit->data + pos / 8, slice->data_size);
  151. slice->data_bit_start = pos % 8;
  152. unit->content = slice;
  153. } else {
  154. switch (unit->type) {
  155. #define START(start_code, type, func) \
  156. case start_code: \
  157. { \
  158. type *header; \
  159. header = av_mallocz(sizeof(*header)); \
  160. if (!header) \
  161. return AVERROR(ENOMEM); \
  162. err = cbs_mpeg2_read_ ## func(ctx, &bc, header); \
  163. if (err < 0) { \
  164. av_free(header); \
  165. return err; \
  166. } \
  167. unit->content = header; \
  168. } \
  169. break;
  170. START(0x00, MPEG2RawPictureHeader, picture_header);
  171. START(0xb2, MPEG2RawUserData, user_data);
  172. START(0xb3, MPEG2RawSequenceHeader, sequence_header);
  173. START(0xb5, MPEG2RawExtensionData, extension_data);
  174. START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
  175. #undef START
  176. default:
  177. av_log(ctx->log_ctx, AV_LOG_ERROR, "Unknown start code %02x.\n",
  178. unit->type);
  179. return AVERROR_INVALIDDATA;
  180. }
  181. }
  182. return 0;
  183. }
  184. static int cbs_mpeg2_write_header(CodedBitstreamContext *ctx,
  185. CodedBitstreamUnit *unit,
  186. PutBitContext *pbc)
  187. {
  188. int err;
  189. switch (unit->type) {
  190. #define START(start_code, type, func) \
  191. case start_code: \
  192. err = cbs_mpeg2_write_ ## func(ctx, pbc, unit->content); \
  193. break;
  194. START(0x00, MPEG2RawPictureHeader, picture_header);
  195. START(0xb2, MPEG2RawUserData, user_data);
  196. START(0xb3, MPEG2RawSequenceHeader, sequence_header);
  197. START(0xb5, MPEG2RawExtensionData, extension_data);
  198. START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
  199. #undef START
  200. default:
  201. av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for start "
  202. "code %02x.\n", unit->type);
  203. return AVERROR_PATCHWELCOME;
  204. }
  205. return err;
  206. }
  207. static int cbs_mpeg2_write_slice(CodedBitstreamContext *ctx,
  208. CodedBitstreamUnit *unit,
  209. PutBitContext *pbc)
  210. {
  211. MPEG2RawSlice *slice = unit->content;
  212. BitstreamContext bc;
  213. size_t bits_left;
  214. int err;
  215. err = cbs_mpeg2_write_slice_header(ctx, pbc, &slice->header);
  216. if (err < 0)
  217. return err;
  218. if (slice->data) {
  219. if (slice->data_size * 8 + 8 > put_bits_left(pbc))
  220. return AVERROR(ENOSPC);
  221. bitstream_init(&bc, slice->data, slice->data_size * 8);
  222. bitstream_skip(&bc, slice->data_bit_start);
  223. while (bitstream_bits_left(&bc) > 15)
  224. put_bits(pbc, 16, bitstream_read(&bc, 16));
  225. bits_left = bitstream_bits_left(&bc);
  226. put_bits(pbc, bits_left, bitstream_read(&bc, bits_left));
  227. // Align with zeroes.
  228. while (put_bits_count(pbc) % 8 != 0)
  229. put_bits(pbc, 1, 0);
  230. }
  231. return 0;
  232. }
  233. static int cbs_mpeg2_write_unit(CodedBitstreamContext *ctx,
  234. CodedBitstreamUnit *unit)
  235. {
  236. CodedBitstreamMPEG2Context *priv = ctx->priv_data;
  237. PutBitContext pbc;
  238. int err;
  239. if (!priv->write_buffer) {
  240. // Initial write buffer size is 1MB.
  241. priv->write_buffer_size = 1024 * 1024;
  242. reallocate_and_try_again:
  243. err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
  244. if (err < 0) {
  245. av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
  246. "sufficiently large write buffer (last attempt "
  247. "%zu bytes).\n", priv->write_buffer_size);
  248. return err;
  249. }
  250. }
  251. init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
  252. if (unit->type >= 0x01 && unit->type <= 0xaf)
  253. err = cbs_mpeg2_write_slice(ctx, unit, &pbc);
  254. else
  255. err = cbs_mpeg2_write_header(ctx, unit, &pbc);
  256. if (err == AVERROR(ENOSPC)) {
  257. // Overflow.
  258. priv->write_buffer_size *= 2;
  259. goto reallocate_and_try_again;
  260. }
  261. if (err < 0) {
  262. // Write failed for some other reason.
  263. return err;
  264. }
  265. if (put_bits_count(&pbc) % 8)
  266. unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
  267. else
  268. unit->data_bit_padding = 0;
  269. unit->data_size = (put_bits_count(&pbc) + 7) / 8;
  270. flush_put_bits(&pbc);
  271. err = av_reallocp(&unit->data, unit->data_size);
  272. if (err < 0)
  273. return err;
  274. memcpy(unit->data, priv->write_buffer, unit->data_size);
  275. return 0;
  276. }
  277. static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx,
  278. CodedBitstreamFragment *frag)
  279. {
  280. uint8_t *data;
  281. size_t size, dp, sp;
  282. int i;
  283. size = 0;
  284. for (i = 0; i < frag->nb_units; i++)
  285. size += 3 + frag->units[i].data_size;
  286. data = av_malloc(size);
  287. if (!data)
  288. return AVERROR(ENOMEM);
  289. dp = 0;
  290. for (i = 0; i < frag->nb_units; i++) {
  291. CodedBitstreamUnit *unit = &frag->units[i];
  292. data[dp++] = 0;
  293. data[dp++] = 0;
  294. data[dp++] = 1;
  295. for (sp = 0; sp < unit->data_size; sp++)
  296. data[dp++] = unit->data[sp];
  297. }
  298. av_assert0(dp == size);
  299. frag->data = data;
  300. frag->data_size = size;
  301. return 0;
  302. }
  303. static void cbs_mpeg2_free_unit(CodedBitstreamUnit *unit)
  304. {
  305. if (MPEG2_START_IS_SLICE(unit->type)) {
  306. MPEG2RawSlice *slice = unit->content;
  307. av_freep(&slice->data);
  308. av_freep(&slice->header.extra_information);
  309. } else if (unit->type == MPEG2_START_USER_DATA) {
  310. MPEG2RawUserData *user = unit->content;
  311. av_freep(&user->user_data);
  312. }
  313. av_freep(&unit->content);
  314. }
  315. static void cbs_mpeg2_close(CodedBitstreamContext *ctx)
  316. {
  317. CodedBitstreamMPEG2Context *priv = ctx->priv_data;
  318. av_freep(&priv->write_buffer);
  319. }
  320. const CodedBitstreamType ff_cbs_type_mpeg2 = {
  321. .codec_id = AV_CODEC_ID_MPEG2VIDEO,
  322. .priv_data_size = sizeof(CodedBitstreamMPEG2Context),
  323. .split_fragment = &cbs_mpeg2_split_fragment,
  324. .read_unit = &cbs_mpeg2_read_unit,
  325. .write_unit = &cbs_mpeg2_write_unit,
  326. .assemble_fragment = &cbs_mpeg2_assemble_fragment,
  327. .free_unit = &cbs_mpeg2_free_unit,
  328. .close = &cbs_mpeg2_close,
  329. };