static void audio_line_place_data_pos(struct audio_line *line, const struct audio_data *data, size_t position) { bool planar = line->audio->planes > 1; size_t total_num = data->frames * (planar ? 1 : line->audio->channels); size_t total_size = data->frames * line->audio->block_size; for (size_t i = 0; i < line->audio->planes; i++) { da_copy_array(line->volume_buffers[i], data->data[i], total_size); uint8_t *array = line->volume_buffers[i].array; switch (line->audio->info.format) { case AUDIO_FORMAT_FLOAT: case AUDIO_FORMAT_FLOAT_PLANAR: mul_vol_float((float*)array, data->volume, total_num); break; default: blog(LOG_ERROR, "audio_line_place_data_pos: " "Unsupported or unknown format"); break; } circlebuf_place(&line->buffers[i], position, line->volume_buffers[i].array, total_size); } }
static inline int ep_parse_param_assign_string(struct effect_parser *ep, struct ep_param *param) { int code; char *str = NULL; if (!cf_next_valid_token(&ep->cfp)) return PARSE_EOF; code = cf_token_is_type(&ep->cfp, CFTOKEN_STRING, "string", ";"); if (code != PARSE_SUCCESS) return code; str = cf_literal_to_str(ep->cfp.cur_token->str.array, ep->cfp.cur_token->str.len); if (str) { da_copy_array(param->default_val, str, strlen(str) + 1); bfree(str); } return PARSE_SUCCESS; }
static bool vaapi_encode(void *data, struct encoder_frame *frame, struct encoder_packet *packet, bool *received_packet) { struct vaapi_encoder *enc = data; AVFrame * hwframe = NULL; AVPacket av_pkt; int got_packet; int ret; hwframe = av_frame_alloc(); if (!hwframe) { warn("vaapi_encode: failed to allocate hw frame"); return false; } ret = av_hwframe_get_buffer(enc->vaframes_ref, hwframe, 0); if (ret < 0) { warn("vaapi_encode: failed to get buffer for hw frame: %s", av_err2str(ret)); goto fail; } copy_data(enc->vframe, frame, enc->height, enc->context->pix_fmt); enc->vframe->pts = frame->pts; hwframe->pts = frame->pts; hwframe->width = enc->vframe->width; hwframe->height = enc->vframe->height; ret = av_hwframe_transfer_data(hwframe, enc->vframe, 0); if (ret < 0) { warn("vaapi_encode: failed to upload hw frame: %s", av_err2str(ret)); goto fail; } ret = av_frame_copy_props(hwframe, enc->vframe); if (ret < 0) { warn("vaapi_encode: failed to copy props to hw frame: %s", av_err2str(ret)); goto fail; } av_init_packet(&av_pkt); #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 40, 101) ret = avcodec_send_frame(enc->context, hwframe); if (ret == 0) ret = avcodec_receive_packet(enc->context, &av_pkt); got_packet = (ret == 0); if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) ret = 0; #else ret = avcodec_encode_video2( enc->context, &av_pkt, hwframe, &got_packet); #endif if (ret < 0) { warn("vaapi_encode: Error encoding: %s", av_err2str(ret)); goto fail; } if (got_packet && av_pkt.size) { if (enc->first_packet) { uint8_t *new_packet; size_t size; enc->first_packet = false; obs_extract_avc_headers(av_pkt.data, av_pkt.size, &new_packet, &size, &enc->header, &enc->header_size, &enc->sei, &enc->sei_size); da_copy_array(enc->buffer, new_packet, size); bfree(new_packet); } else { da_copy_array(enc->buffer, av_pkt.data, av_pkt.size); } packet->pts = av_pkt.pts; packet->dts = av_pkt.dts; packet->data = enc->buffer.array; packet->size = enc->buffer.num; packet->type = OBS_ENCODER_VIDEO; packet->keyframe = obs_avc_keyframe(packet->data, packet->size); *received_packet = true; } else { *received_packet = false; } av_packet_unref(&av_pkt); av_frame_free(&hwframe); return true; fail: av_frame_free(&hwframe); return false; }