gfiber / vendor / opensource / ffmpeg / 0fda37cff9470c602fd59366ac4250a9a4eae6b1 / . / libavcodec / h264dspenc.c

/* | |

* H.264/MPEG-4 Part 10 (Base profile) encoder. | |

* | |

* DSP functions | |

* | |

* Copyright (c) 2006 Expertisecentrum Digitale Media, UHasselt | |

* | |

* FFmpeg is free software; you can redistribute it and/or | |

* modify it under the terms of the GNU Lesser General Public | |

* License as published by the Free Software Foundation; either | |

* version 2.1 of the License, or (at your option) any later version. | |

* | |

* FFmpeg is distributed in the hope that it will be useful, | |

* but WITHOUT ANY WARRANTY; without even the implied warranty of | |

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |

* Lesser General Public License for more details. | |

* | |

* You should have received a copy of the GNU Lesser General Public | |

* License along with FFmpeg; if not, write to the Free Software | |

* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |

*/ | |

/** | |

* @file libavcodec/h264dspenc.c | |

* H.264 encoder related DSP utils | |

* | |

*/ | |

#include "dsputil.h" | |

#define H264_DCT_PART1(X) \ | |

a = block[0][X]+block[3][X]; \ | |

c = block[0][X]-block[3][X]; \ | |

b = block[1][X]+block[2][X]; \ | |

d = block[1][X]-block[2][X]; \ | |

pieces[0][X] = a+b; \ | |

pieces[2][X] = a-b; \ | |

pieces[1][X] = (c<<1)+d; \ | |

pieces[3][X] = c-(d<<1); | |

#define H264_DCT_PART2(X) \ | |

a = pieces[X][0]+pieces[X][3]; \ | |

c = pieces[X][0]-pieces[X][3]; \ | |

b = pieces[X][1]+pieces[X][2]; \ | |

d = pieces[X][1]-pieces[X][2]; \ | |

block[0][X] = a+b; \ | |

block[2][X] = a-b; \ | |

block[1][X] = (c<<1)+d; \ | |

block[3][X] = c-(d<<1); | |

/** | |

* Transform the provided matrix using the H.264 modified DCT. | |

* @note | |

* we'll always work with transposed input blocks, to avoid having to make a | |

* distinction between C and mmx implementations. | |

* | |

* @param block transposed input block | |

*/ | |

static void h264_dct_c(DCTELEM block[4][4]) | |

{ | |

DCTELEM pieces[4][4]; | |

DCTELEM a, b, c, d; | |

H264_DCT_PART1(0); | |

H264_DCT_PART1(1); | |

H264_DCT_PART1(2); | |

H264_DCT_PART1(3); | |

H264_DCT_PART2(0); | |

H264_DCT_PART2(1); | |

H264_DCT_PART2(2); | |

H264_DCT_PART2(3); | |

} | |

void ff_h264dspenc_init(DSPContext* c, AVCodecContext *avctx) | |

{ | |

c->h264_dct = h264_dct_c; | |

} | |