static int ircam_write_header(AVFormatContext *s) { AVCodecContext *codec = s->streams[0]->codec; uint32_t tag; if (s->nb_streams != 1) { av_log(s, AV_LOG_ERROR, "only one stream is supported\n"); return AVERROR(EINVAL); } tag = ff_codec_get_tag(ff_codec_ircam_le_tags, codec->codec_id); if (!tag) { av_log(s, AV_LOG_ERROR, "unsupported codec\n"); return AVERROR(EINVAL); } avio_wl32(s->pb, 0x0001A364); avio_wl32(s->pb, av_float2int(codec->sample_rate)); avio_wl32(s->pb, codec->channels); avio_wl32(s->pb, tag); ffio_fill(s->pb, 0, 1008); return 0; }
static int filter_frame(AVFilterLink *link, AVFrame *in) { TonemapContext *s = link->dst->priv; AVFilterLink *outlink = link->dst->outputs[0]; AVFrame *out; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); const AVPixFmtDescriptor *odesc = av_pix_fmt_desc_get(outlink->format); int ret, x, y; double peak = s->peak; if (!desc || !odesc) { av_frame_free(&in); return AVERROR_BUG; } out = ff_get_video_buffer(outlink, outlink->w, outlink->h); if (!out) { av_frame_free(&in); return AVERROR(ENOMEM); } ret = av_frame_copy_props(out, in); if (ret < 0) { av_frame_free(&in); av_frame_free(&out); return ret; } /* input and output transfer will be linear */ if (in->color_trc == AVCOL_TRC_UNSPECIFIED) { av_log(s, AV_LOG_WARNING, "Untagged transfer, assuming linear light\n"); out->color_trc = AVCOL_TRC_LINEAR; } else if (in->color_trc != AVCOL_TRC_LINEAR) av_log(s, AV_LOG_WARNING, "Tonemapping works on linear light only\n"); /* read peak from side data if not passed in */ if (!peak) { peak = ff_determine_signal_peak(in); av_log(s, AV_LOG_DEBUG, "Computed signal peak: %f\n", peak); } /* load original color space even if pixel format is RGB to compute overbrights */ s->coeffs = &luma_coefficients[in->colorspace]; if (s->desat > 0 && (in->colorspace == AVCOL_SPC_UNSPECIFIED || !s->coeffs)) { if (in->colorspace == AVCOL_SPC_UNSPECIFIED) av_log(s, AV_LOG_WARNING, "Missing color space information, "); else if (!s->coeffs) av_log(s, AV_LOG_WARNING, "Unsupported color space '%s', ", av_color_space_name(in->colorspace)); av_log(s, AV_LOG_WARNING, "desaturation is disabled\n"); s->desat = 0; } /* do the tone map */ for (y = 0; y < out->height; y++) for (x = 0; x < out->width; x++) tonemap(s, out, in, desc, x, y, peak); /* copy/generate alpha if needed */ if (desc->flags & AV_PIX_FMT_FLAG_ALPHA && odesc->flags & AV_PIX_FMT_FLAG_ALPHA) { av_image_copy_plane(out->data[3], out->linesize[3], in->data[3], in->linesize[3], out->linesize[3], outlink->h); } else if (odesc->flags & AV_PIX_FMT_FLAG_ALPHA) { for (y = 0; y < out->height; y++) { for (x = 0; x < out->width; x++) { AV_WN32(out->data[3] + x * odesc->comp[3].step + y * out->linesize[3], av_float2int(1.0f)); } } } av_frame_free(&in); ff_update_hdr_metadata(out, peak); return ff_filter_frame(outlink, out); }