胡斌

implement using the height of student and teacher when merge one to one layout

it is to be improved in one to many case if the size of each student frame is different
#include "AVTranscoder.h"
#include "tools.h"
#include <minmax.h>
extern "C" {
#include <libswscale/swscale.h>
... ... @@ -13,7 +14,7 @@ uint8_t blank_r = 0x16;
uint8_t blank_g = 0x5a;
uint8_t blank_b = 0x82;
CAVTranscoder::CAVTranscoder(bool bOne2One,int width,int height):
CAVTranscoder::CAVTranscoder(bool bOne2One, int width_teacher, int height_teacher, int width_student, int height_student) :
_start_time(INT64_MAX),
_all_processed(true),
_nOutputWidth(320),
... ... @@ -30,22 +31,25 @@ _last_videos_got(-1),
_teacherFrame(NULL),
_studentFrame(NULL)
{
_src_width = width;
_src_height = height;
_scaled_width = _src_width * 10 / 32;
_scaled_height = _src_height * 10 / 32;
_teacher_width = width_teacher;
_teacher_height = height_teacher;
_student_width = width_student;
_student_height = height_student;
_scaled_width = _teacher_width * 10 / 32;
_scaled_height = _teacher_height * 10 / 32;
_one2one = bOne2One;
if (_one2one) {
_nOutputWidth = _src_width;
_nOutputHeight = _src_height * 2;
_nOutputWidth = max(_teacher_width, _student_width);
_nOutputHeight = _teacher_height + _student_height;
}
else {
_nOutputWidth = _src_width;
_nOutputHeight = _src_height;
_nOutputWidth = _teacher_width;
_nOutputHeight = _teacher_height;
init_scale_context(&_sws_ctx_w_h, &_scaled_frame_w_h, _src_width, _src_height, _scaled_width, _scaled_height);
init_scale_context(&_sws_ctx_h_w, &_scaled_frame_h_w, _src_height, _src_width, _scaled_height, _scaled_width);
init_scale_context(&_sws_ctx_h_h, &_scaled_frame_h_h, _src_height, _src_height, _scaled_height, _scaled_height);
init_scale_context(&_sws_ctx_w_h, &_scaled_frame_w_h, _student_width, _student_height, _scaled_width, _scaled_height);
init_scale_context(&_sws_ctx_h_w, &_scaled_frame_h_w, _student_height, _student_width, _scaled_height, _scaled_width);
init_scale_context(&_sws_ctx_h_h, &_scaled_frame_h_h, _student_height, _student_height, _scaled_height, _scaled_height);
}
RGB2YUV(blank_r, blank_g, blank_b, &_blank_y, &_blank_u, &_blank_v);
}
... ... @@ -370,7 +374,7 @@ int CAVTranscoder::open_output_file(const char *filename)
continue;
}
int h = 0;
if (pFrame->width == _src_width && pFrame->height == _src_height) {
if (pFrame->width == _student_width && pFrame->height == _student_height) {
h = sws_scale(_sws_ctx_w_h, pFrame->data, pFrame->linesize, 0, pFrame->height,
_scaled_frame_w_h->data, _scaled_frame_w_h->linesize);
if (h <= 0){
... ... @@ -378,9 +382,9 @@ int CAVTranscoder::open_output_file(const char *filename)
continue;
}
_scaled_frame_w_h->pkt_dts = pFrame->pkt_dts;//pass rotation
fillDestFrame(pDstFrame, _scaled_frame_w_h, _src_width - (imageIdx % 4 + 1) * (_scaled_height + 5) + 4, _src_height - _scaled_height + 3 - (_scaled_height + 1)*(imageIdx / 4), (_scaled_width - _scaled_height) / 2, 0, _scaled_height - 3, _scaled_height - 3);
fillDestFrame(pDstFrame, _scaled_frame_w_h, _teacher_width - (imageIdx % 4 + 1) * (_scaled_height + 5) + 4, _teacher_height - _scaled_height + 3 - (_scaled_height + 1)*(imageIdx / 4), (_scaled_width - _scaled_height) / 2, 0, _scaled_height - 3, _scaled_height - 3);
}
else if (pFrame->width == _src_height && pFrame->height == _src_width) {
else if (pFrame->width == _student_height && pFrame->height == _student_width) {
h = sws_scale(_sws_ctx_h_w, pFrame->data, pFrame->linesize, 0, pFrame->height,
_scaled_frame_h_w->data, _scaled_frame_h_w->linesize);
if (h <= 0){
... ... @@ -388,10 +392,10 @@ int CAVTranscoder::open_output_file(const char *filename)
continue;
}
_scaled_frame_h_w->pkt_dts = pFrame->pkt_dts;//pass rotation
fillDestFrame(pDstFrame, _scaled_frame_h_w, _src_width - (imageIdx % 4 + 1) * (_scaled_height + 5) + 4, _src_height - _scaled_height + 3 - (_scaled_height + 1)*(imageIdx / 4), 0, (_scaled_width - _scaled_height) / 2, _scaled_height - 3, _scaled_height - 3);
fillDestFrame(pDstFrame, _scaled_frame_h_w, _teacher_width - (imageIdx % 4 + 1) * (_scaled_height + 5) + 4, _teacher_height - _scaled_height + 3 - (_scaled_height + 1)*(imageIdx / 4), 0, (_scaled_width - _scaled_height) / 2, _scaled_height - 3, _scaled_height - 3);
}
else if (pFrame->width == _src_height && pFrame->height == _src_height) {
else if (pFrame->width == _student_height && pFrame->height == _student_height) {
h = sws_scale(_sws_ctx_h_h, pFrame->data, pFrame->linesize, 0, pFrame->height,
_scaled_frame_h_h->data, _scaled_frame_h_h->linesize);
if (h <= 0){
... ... @@ -399,7 +403,7 @@ int CAVTranscoder::open_output_file(const char *filename)
continue;
}
_scaled_frame_h_h->pkt_dts = pFrame->pkt_dts;//pass rotation
fillDestFrame(pDstFrame, _scaled_frame_h_h, _src_width - (imageIdx % 4 + 1) * (_scaled_height + 5) + 4, _src_height - _scaled_height + 3 - (_scaled_height + 1)*(imageIdx / 4), 0, 0, _scaled_height - 3, _scaled_height - 3);
fillDestFrame(pDstFrame, _scaled_frame_h_h, _teacher_width - (imageIdx % 4 + 1) * (_scaled_height + 5) + 4, _teacher_height - _scaled_height + 3 - (_scaled_height + 1)*(imageIdx / 4), 0, 0, _scaled_height - 3, _scaled_height - 3);
}
else {
printf("\nthe frame resolution %dx%d is unexpected! ignored!", pFrame->width, pFrame->height);
... ... @@ -609,90 +613,110 @@ int CAVTranscoder::open_output_file(const char *filename)
}
if (_teacherFrame) {
if (_teacherFrame->width == _src_width && _teacherFrame->height == _src_height) {
if (_teacherFrame->width == _teacher_width && _teacherFrame->height == _teacher_height) {
if (_teacherFrame->pkt_dts != 90){
if (_teacher_width < _nOutputWidth) {
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _teacher_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _teacher_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _teacher_height / 4);
}
fillDestFrame(pDstFrame, _teacherFrame, 0, 0);
}
else {
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
fillDestFrame(pDstFrame, _teacherFrame, (_src_width - _src_height) / 2, 0, (_src_width - _src_height) / 2, 0, _src_height, _src_height);
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _teacher_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _teacher_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _teacher_height / 4);
fillDestFrame(pDstFrame, _teacherFrame, (_nOutputWidth - _teacher_height) / 2, 0, (_teacher_width - _teacher_height) / 2, 0, _teacher_height, _teacher_height);
}
}
else if (_teacherFrame->width == _src_height && _teacherFrame->height == _src_width) {
else if (_teacherFrame->width == _teacher_height && _teacherFrame->height == _teacher_width) {
if (_teacherFrame->pkt_dts == 90){
if (_teacher_width < _nOutputWidth) {
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _teacher_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _teacher_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _teacher_height / 4);
}
fillDestFrame(pDstFrame, _teacherFrame, 0, 0);
}
else {
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
fillDestFrame(pDstFrame, _teacherFrame, (_src_width - _src_height) / 2, 0, 0, (_src_width - _src_height) / 2, _src_height, _src_height);
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _teacher_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _teacher_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _teacher_height / 4);
fillDestFrame(pDstFrame, _teacherFrame, (_nOutputWidth - _teacher_height) / 2, 0, 0, (_teacher_width - _teacher_height) / 2, _teacher_height, _teacher_height);
}
}
else if (_teacherFrame->width == _src_height && _teacherFrame->height == _src_height) {
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
fillDestFrame(pDstFrame, _teacherFrame, (_src_width - _src_height) / 2, 0);
else if (_teacherFrame->width == _teacher_height && _teacherFrame->height == _teacher_height) {
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _teacher_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _teacher_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _teacher_height / 4);
fillDestFrame(pDstFrame, _teacherFrame, (_nOutputWidth - _teacher_height) / 2, 0);
}
else {
//printf("\nresolution: %dx%d unexpected!", _teacherFrame->width, _teacherFrame->height);
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _teacher_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _teacher_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _teacher_height / 4);
fillDestFrame(pDstFrame, _teacherFrame, 0, 0);
}
if (_studentFrame) {
if (_studentFrame->width == _src_width) {
if (_studentFrame->width == _student_width) {
if (_studentFrame->pkt_dts != 90){
fillDestFrame(pDstFrame, _studentFrame, 0, _src_height);
if (_student_width < _nOutputWidth) {
memset(pDstFrame->data[0] + _teacher_height * pDstFrame->linesize[0], _blank_y, _nOutputWidth * _student_height);
memset(pDstFrame->data[1] + _teacher_height / 2 * pDstFrame->linesize[1], _blank_u, _nOutputWidth * _student_height / 4);
memset(pDstFrame->data[2] + _teacher_height / 2 * pDstFrame->linesize[2], _blank_v, _nOutputWidth * _student_height / 4);
}
fillDestFrame(pDstFrame, _studentFrame, 0, _teacher_height);
}
else {
memset(pDstFrame->data[0] + _src_height * pDstFrame->linesize[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1] + _src_height / 2 * pDstFrame->linesize[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2] + _src_height / 2 * pDstFrame->linesize[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
fillDestFrame(pDstFrame, _studentFrame, (_src_width - _src_height) / 2, _src_height, (_src_width - _src_height) / 2, 0, _src_height, _src_height);
memset(pDstFrame->data[0] + _teacher_height * pDstFrame->linesize[0], _blank_y, _nOutputWidth * _student_height);
memset(pDstFrame->data[1] + _teacher_height / 2 * pDstFrame->linesize[1], _blank_u, _nOutputWidth * _student_height / 4);
memset(pDstFrame->data[2] + _teacher_height / 2 * pDstFrame->linesize[2], _blank_v, _nOutputWidth * _student_height / 4);
fillDestFrame(pDstFrame, _studentFrame, (_nOutputWidth - _student_height) / 2, _teacher_height, (_student_width - _student_height) / 2, 0, _student_height, _student_height);
}
}
else if (_studentFrame->pkt_dts == 90){
fillDestFrame(pDstFrame, _studentFrame, 0, _src_height);
if (_student_width < _nOutputWidth) {
memset(pDstFrame->data[0] + _teacher_height * pDstFrame->linesize[0], _blank_y, _nOutputWidth * _student_height);
memset(pDstFrame->data[1] + _teacher_height / 2 * pDstFrame->linesize[1], _blank_u, _nOutputWidth * _student_height / 4);
memset(pDstFrame->data[2] + _teacher_height / 2 * pDstFrame->linesize[2], _blank_v, _nOutputWidth * _student_height / 4);
}
fillDestFrame(pDstFrame, _studentFrame, 0, _teacher_height);
}
else {
memset(pDstFrame->data[0] + _src_height * pDstFrame->linesize[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1] + _src_height / 2 * pDstFrame->linesize[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2] + _src_height / 2 * pDstFrame->linesize[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
fillDestFrame(pDstFrame, _studentFrame, (_src_width - _src_height) / 2, _src_height, 0, (_src_width - _src_height) / 2, _src_height, _src_height);
memset(pDstFrame->data[0] + _teacher_height * pDstFrame->linesize[0], _blank_y, _nOutputWidth * _student_height);
memset(pDstFrame->data[1] + _teacher_height / 2 * pDstFrame->linesize[1], _blank_u, _nOutputWidth * _student_height / 4);
memset(pDstFrame->data[2] + _teacher_height / 2 * pDstFrame->linesize[2], _blank_v, _nOutputWidth * _student_height / 4);
fillDestFrame(pDstFrame, _studentFrame, (_nOutputWidth - _student_height) / 2, _teacher_height, 0, (_student_width - _student_height) / 2, _student_height, _student_height);
}
}
}
else if (_studentFrame) {
if (_studentFrame->width == _src_width && _studentFrame->height == _src_height) {
if (_studentFrame->width == _student_width && _studentFrame->height == _student_height) {
if (_studentFrame->pkt_dts != 90){
fillDestFrame(pDstFrame, _studentFrame, 0, 0);
}
else {
fillDestFrame(pDstFrame, _studentFrame, (_src_width - _src_height) / 2, 0, (_src_width - _src_height) / 2, 0, _src_height, _src_height);
fillDestFrame(pDstFrame, _studentFrame, (_nOutputWidth - _student_height) / 2, 0, (_student_width - _student_height) / 2, 0, _student_height, _student_height);
}
}
else if (_studentFrame->width == _src_height && _studentFrame->height == _src_width) {
else if (_studentFrame->width == _student_height && _studentFrame->height == _student_width) {
if (_studentFrame->pkt_dts == 90){
fillDestFrame(pDstFrame, _studentFrame, 0, 0);
}
else {
fillDestFrame(pDstFrame, _studentFrame, (_src_width - _src_height) / 2, 0, 0, (_src_width - _src_height) / 2, _src_height, _src_height);
fillDestFrame(pDstFrame, _studentFrame, (_nOutputWidth - _student_height) / 2, 0, 0, (_student_width - _student_height) / 2, _student_height, _student_height);
}
}
else if (_studentFrame->width == _src_height && _studentFrame->height == _src_height) {
fillDestFrame(pDstFrame, _studentFrame, (_src_width - _src_height) / 2, 0);
else if (_studentFrame->width == _student_height && _studentFrame->height == _student_height) {
fillDestFrame(pDstFrame, _studentFrame, (_nOutputWidth - _student_height) / 2, 0);
}
else {
//printf("\nresolution: %dx%d unexpected!", _studentFrame->width, _studentFrame->height);
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _nOutputHeight / 2);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _nOutputHeight / 8);
memset(pDstFrame->data[0], _blank_y, _nOutputWidth * _student_height);
memset(pDstFrame->data[1], _blank_u, _nOutputWidth * _student_height / 4);
memset(pDstFrame->data[2], _blank_v, _nOutputWidth * _student_height / 4);
fillDestFrame(pDstFrame, _studentFrame, 0, 0);
}
}
... ...
... ... @@ -5,7 +5,7 @@
class CAVTranscoder
{
public:
CAVTranscoder(bool bOne2One, int width, int height);
CAVTranscoder(bool bOne2One, int width_teacher, int height_teacher, int student_width,int student_height);
virtual ~CAVTranscoder();
int add(media_info & info);
... ... @@ -46,8 +46,10 @@ private:
int _max_audio;
int _scaled_width;
int _scaled_height;
int _src_width;
int _src_height;
int _teacher_width;
int _teacher_height;
int _student_width;
int _student_height;
struct SwsContext * _sws_ctx_w_h;
struct SwsContext * _sws_ctx_h_w;
struct SwsContext * _sws_ctx_h_h;
... ...
... ... @@ -1123,7 +1123,7 @@ int process_av_files(char * record_info, int piptype)
}
}
CAVTranscoder videoTranscoder(one2one, width, height);
CAVTranscoder videoTranscoder(one2one, width_teacher, height_teacher,width_student, height_student);
videoTranscoder.set_max_audio(max_audio);
int64_t cur_time = 0;
... ...