Ticket #966: patchfrwu.diff

File patchfrwu.diff, 2.3 KB (added by cehoyos, 4 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};