Ticket #966: patchfrwu.diff

File patchfrwu.diff, 2.3 KB (added by cehoyos, 6 years ago)
  • libavcodec/frwu.c

    diff --git a/libavcodec/frwu.c b/libavcodec/frwu.c
    index c70013b..6e2522f 100644
    a b  
    2222
    2323#include "avcodec.h"
    2424#include "bytestream.h"
     25#include "libavutil/opt.h"
     26
     27typedef struct {
     28    AVClass *av_class;
     29    int change_field_order;
     30} FRWUContext;
    2531
    2632static av_cold int decode_init(AVCodecContext *avctx)
    2733{
    static av_cold int decode_init(AVCodecContext *avctx) 
    4147static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
    4248                        AVPacket *avpkt)
    4349{
     50    FRWUContext *s = avctx->priv_data;
    4451    int field, ret;
    4552    AVFrame *pic = avctx->coded_frame;
    4653    const uint8_t *buf = avpkt->data;
    static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, 
    8491            av_log(avctx, AV_LOG_ERROR, "Packet is too small, need %i, have %i\n", field_size, (int)(buf_end - buf));
    8592            return AVERROR_INVALIDDATA;
    8693        }
    87         if (field)
     94        if (field ^ s->change_field_order) {
    8895            dst += pic->linesize[0];
     96        } else if (s->change_field_order) {
     97            dst += 2 * pic->linesize[0];
     98        }
    8999        for (i = 0; i < field_h; i++) {
     100            if (s->change_field_order && field && i == field_h - 1)
     101                dst = pic->data[0];
    90102            memcpy(dst, buf, avctx->width * 2);
    91103            buf += avctx->width * 2;
    92104            dst += pic->linesize[0] << 1;
    static av_cold int decode_close(AVCodecContext *avctx) 
    110122    return 0;
    111123}
    112124
     125static const AVOption frwu_options[] = {
     126    {"change_field_order", "Change frwu field order", offsetof(FRWUContext, change_field_order), FF_OPT_TYPE_INT,
     127     {.dbl = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM},
     128    {NULL}
     129};
     130
     131static const AVClass frwu_class = {
     132    "frwu Decoder",
     133    av_default_item_name,
     134    frwu_options,
     135    LIBAVUTIL_VERSION_INT,
     136};
     137
    113138AVCodec ff_frwu_decoder = {
    114139    .name           = "frwu",
    115140    .type           = AVMEDIA_TYPE_VIDEO,
    116141    .id             = AV_CODEC_ID_FRWU,
     142    .priv_data_size = sizeof(FRWUContext),
    117143    .init           = decode_init,
    118144    .close          = decode_close,
    119145    .decode         = decode_frame,
    120146    .capabilities   = CODEC_CAP_DR1,
    121147    .long_name      = NULL_IF_CONFIG_SMALL("Forward Uncompressed"),
     148    .priv_class     = &frwu_class,
    122149};