static int vaapi_encode_h265_write_access_unit(AVCodecContext *avctx, char *data, size_t *data_len, CodedBitstreamFragment *au) { VAAPIEncodeH265Context *priv = avctx->priv_data; int err; err = ff_cbs_write_fragment_data(priv->cbc, au); if (err < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n"); return err; } if (*data_len < 8 * au->data_size - au->data_bit_padding) { av_log(avctx, AV_LOG_ERROR, "Access unit too large: " "%zu < %zu.\n", *data_len, 8 * au->data_size - au->data_bit_padding); return AVERROR(ENOSPC); } memcpy(data, au->data, au->data_size); *data_len = 8 * au->data_size - au->data_bit_padding; return 0; }
int ff_cbs_write_packet(CodedBitstreamContext *ctx, AVPacket *pkt, CodedBitstreamFragment *frag) { int err; err = ff_cbs_write_fragment_data(ctx, frag); if (err < 0) return err; err = av_new_packet(pkt, frag->data_size); if (err < 0) return err; memcpy(pkt->data, frag->data, frag->data_size); pkt->size = frag->data_size; return 0; }
int ff_cbs_write_packet(CodedBitstreamContext *ctx, AVPacket *pkt, CodedBitstreamFragment *frag) { AVBufferRef *buf; int err; err = ff_cbs_write_fragment_data(ctx, frag); if (err < 0) return err; buf = av_buffer_ref(frag->data_ref); if (!buf) return AVERROR(ENOMEM); av_init_packet(pkt); pkt->buf = buf; pkt->data = frag->data; pkt->size = frag->data_size; return 0; }
int ff_cbs_write_extradata(CodedBitstreamContext *ctx, AVCodecParameters *par, CodedBitstreamFragment *frag) { int err; err = ff_cbs_write_fragment_data(ctx, frag); if (err < 0) return err; av_freep(&par->extradata); par->extradata = av_malloc(frag->data_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!par->extradata) return AVERROR(ENOMEM); memcpy(par->extradata, frag->data, frag->data_size); memset(par->extradata + frag->data_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); par->extradata_size = frag->data_size; return 0; }
static int vaapi_encode_mjpeg_write_image_header(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len) { VAAPIEncodeMJPEGContext *priv = avctx->priv_data; CodedBitstreamFragment *frag = &priv->current_fragment; int err; if (priv->jfif) { err = ff_cbs_insert_unit_content(priv->cbc, frag, -1, JPEG_MARKER_APPN + 0, &priv->jfif_header, NULL); if (err < 0) goto fail; } err = ff_cbs_insert_unit_content(priv->cbc, frag, -1, JPEG_MARKER_DQT, &priv->quant_tables, NULL); if (err < 0) goto fail; err = ff_cbs_insert_unit_content(priv->cbc, frag, -1, JPEG_MARKER_SOF0, &priv->frame_header, NULL); if (err < 0) goto fail; if (priv->huffman) { err = ff_cbs_insert_unit_content(priv->cbc, frag, -1, JPEG_MARKER_DHT, &priv->huffman_tables, NULL); if (err < 0) goto fail; } err = ff_cbs_insert_unit_content(priv->cbc, frag, -1, JPEG_MARKER_SOS, &priv->scan, NULL); if (err < 0) goto fail; err = ff_cbs_write_fragment_data(priv->cbc, frag); if (err < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to write image header.\n"); goto fail; } if (*data_len < 8 * frag->data_size) { av_log(avctx, AV_LOG_ERROR, "Image header too large: " "%zu < %zu.\n", *data_len, 8 * frag->data_size); err = AVERROR(ENOSPC); goto fail; } // Remove the EOI at the end of the fragment. memcpy(data, frag->data, frag->data_size - 2); *data_len = 8 * (frag->data_size - 2); err = 0; fail: ff_cbs_fragment_uninit(priv->cbc, frag); return err; }