xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #415: ffmpeg2.patch

File ffmpeg2.patch, 5.0 KB (added by Antoine Martin, 8 years ago)

untested patch

  • xpra/codecs/dec_avcodec/decoder.pyx

     
    99debug = debug_if_env(log, "XPRA_AVCODEC_DEBUG")
    1010error = log.error
    1111
     12DEF GET_BUFFER_V2 = False
     13
     14
    1215#some consumers need a writeable buffer (ie: OpenCL...)
    1316READ_ONLY = False
    1417
     
    9699                                int *got_picture_ptr, const AVPacket *avpkt) nogil
    97100
    98101    #buffer management:
    99     int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)
    100     void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)
     102    IF GET_BUFFER_V2:
     103        int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags)
     104    ELSE:
     105        int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)
     106        void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)
    101107
    102108
    103109def get_version():
     
    194200    return decoder
    195201
    196202
     203IF GET_BUFFER_V2:
     204    cdef int avcodec_get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags) with gil:
     205        """ This function overrides AVCodecContext.get_buffer2:
     206            we create an AVFrameWrapper object and
     207            register it with the Decoder for this context.
     208        """
     209        cdef unsigned long frame_key = 0
     210        cdef AVFrameWrapper frame_wrapper
     211        cdef int ret
     212        decoder = get_decoder(avctx)
     213        ret = avcodec_default_get_buffer2(avctx, frame, flags)
     214        if ret==0:
     215            frame_key = get_frame_key(frame)
     216            frame_wrapper = AVFrameWrapper()
     217            frame_wrapper.set_context(avctx, frame)
     218            decoder.add_framewrapper(frame_key, frame_wrapper)
     219        #debug("avcodec_get_buffer(%s, %s) ret=%s, decoder=%s, frame pointer=%s",
     220        #        hex(<unsigned long> avctx), hex(frame_key), ret, decoder, hex(frame_key))
     221        return ret
    197222
    198 cdef int avcodec_get_buffer(AVCodecContext *avctx, AVFrame *frame) with gil:
    199     """ This function overrides AVCodecContext.get_buffer:
    200         we create an AVFrameWrapper object and
    201         register it with the Decoder for this context.
    202     """
    203     cdef unsigned long frame_key = 0
    204     cdef AVFrameWrapper frame_wrapper
    205     cdef int ret
    206     decoder = get_decoder(avctx)
    207     ret = avcodec_default_get_buffer(avctx, frame)
    208     if ret==0:
    209         frame_key = get_frame_key(frame)
    210         frame_wrapper = AVFrameWrapper()
    211         frame_wrapper.set_context(avctx, frame)
    212         decoder.add_framewrapper(frame_key, frame_wrapper)
    213     #debug("avcodec_get_buffer(%s, %s) ret=%s, decoder=%s, frame pointer=%s",
    214     #        hex(<unsigned long> avctx), hex(frame_key), ret, decoder, hex(frame_key))
    215     return ret
     223    cdef void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic):
     224        pass
    216225
    217 cdef void avcodec_release_buffer(AVCodecContext *avctx, AVFrame *frame) with gil:
    218     """ when avcodec releases the buffer,
    219         we tell the Decoder to manage it.
    220     """
    221     cdef unsigned long frame_key = get_frame_key(frame)
    222     decoder = get_decoder(avctx)
    223     decoder.av_free(frame_key)
     226ELSE:
     227    cdef int avcodec_get_buffer(AVCodecContext *avctx, AVFrame *frame) with gil:
     228        """ This function overrides AVCodecContext.get_buffer:
     229            we create an AVFrameWrapper object and
     230            register it with the Decoder for this context.
     231        """
     232        cdef unsigned long frame_key = 0        #@DuplicateSignature
     233        cdef AVFrameWrapper frame_wrapper       #@DuplicateSignature
     234        cdef int ret                            #@DuplicateSignature
     235        decoder = get_decoder(avctx)
     236        ret = avcodec_default_get_buffer(avctx, frame)
     237        if ret==0:
     238            frame_key = get_frame_key(frame)
     239            frame_wrapper = AVFrameWrapper()
     240            frame_wrapper.set_context(avctx, frame)
     241            decoder.add_framewrapper(frame_key, frame_wrapper)
     242        #debug("avcodec_get_buffer(%s, %s) ret=%s, decoder=%s, frame pointer=%s",
     243        #        hex(<unsigned long> avctx), hex(frame_key), ret, decoder, hex(frame_key))
     244        return ret
     245   
     246   
     247    cdef void avcodec_release_buffer(AVCodecContext *avctx, AVFrame *frame) with gil:
     248        """ when avcodec releases the buffer,
     249            we tell the Decoder to manage it.
     250        """
     251        cdef unsigned long frame_key = get_frame_key(frame)
     252        decoder = get_decoder(avctx)
     253        decoder.av_free(frame_key)
    224254
    225255
    226256cdef class AVFrameWrapper:
     
    368398        self.codec_ctx.width = width
    369399        self.codec_ctx.height = height
    370400        self.codec_ctx.pix_fmt = self.pix_fmt
    371         self.codec_ctx.get_buffer = avcodec_get_buffer
     401        IF GET_BUFFER_V2:
     402            self.codec_ctx.get_buffer2 = avcodec_get_buffer2
     403        ELSE:
     404            self.codec_ctx.get_buffer = avcodec_get_buffer
    372405        self.codec_ctx.release_buffer = avcodec_release_buffer
    373406        self.codec_ctx.thread_safe_callbacks = 1
    374407        self.codec_ctx.thread_type = 2      #FF_THREAD_SLICE: allow more than one thread per frame