| | |
| | | * @param mainData |
| | | */ |
| | | void waterYUV(uint8_t *mainData[3]) { |
| | | waterYUV(pushMiniDatas.size(),mainData); |
| | | } |
| | | void waterYUV(int index,uint8_t *mainData[3]) { |
| | | //LOGI("waterYUV 加水印(画中画)"); |
| | | int size = pushMiniDatas.size(); |
| | | for (int i = 0; i < pushMiniDatas.size(); ++i) { |
| | | for (int i = 0; i < index; ++i) { |
| | | MiniViewData *pData = pushMiniDatas[i]; |
| | | if(pData->streamCode == mainStreamCode){ |
| | | continue; |
| | | } |
| | | if(!pData->videoOn){ |
| | | continue; |
| | | } |
| | | if(pData->streamType == 6){ |
| | | jvmMainCall->drawText(pData->streamCode,mainData); |
| | | } |
| | | if(!pData->scaledYuvFrame && pData->scaledYuvFrames.size() == 0 ){ |
| | | //LOGE("小窗丢帧1"); |
| | |
| | | |
| | | YUVData *scaledYuvFrame = pData->scaledYuvFrame; |
| | | //位置 |
| | | int offsetY = (mainHeight - scaledYuvFrame->height) * scaledYuvFrame->pYrate; |
| | | int offsetX = (mainWidth - scaledYuvFrame->width) * scaledYuvFrame->pXrate; |
| | | int offsetY = (mainHeight - scaledYuvFrame->height) * (pData->streamType == 6 ? pData->pYrate : scaledYuvFrame->pYrate); |
| | | int offsetX = (mainWidth - scaledYuvFrame->width) * (pData->streamType == 6 ? pData->pXrate : scaledYuvFrame->pXrate); |
| | | |
| | | //LOGI("waterYUV %dx%d x:%d,y:%d x:%f,y:%f [0]:%d",pData->scaleWidth,miniHeight,pData->pYrate,pData->pXrate,offsetX,offsetY,pData->scaledYUVData[0]); |
| | | LOGI("waterYUV %dx%d x:%d,y:%d x:%d,y:%d ",scaledYuvFrame->width,scaledYuvFrame->height,pData->pYrate,pData->pXrate,offsetX,offsetY); |
| | | |
| | | // 边界检查,确保不会越界 |
| | | if (offsetX + scaledYuvFrame->width > mainWidth ) { |
| | |
| | | for (int y = 0; y < scaledYuvFrame->height / 2; y++) { |
| | | uint8_t* main_u_row = mainData[1] + ((offsetY / 2) + y) * (mainWidth / 2) + (offsetX / 2); |
| | | uint8_t* mini_u_row = scaledYuvFrame->yuvData[1] + y * (scaledYuvFrame->width / 2); |
| | | |
| | | memcpy(main_u_row, mini_u_row, scaledYuvFrame->width / 2); |
| | | } |
| | | |
| | | // 处理 V 平面 |
| | | for (int y = 0; y < scaledYuvFrame->height / 2; y++) { |
| | | uint8_t* main_v_row = mainData[2] + ((offsetY / 2) + y) * (mainWidth / 2) + (offsetX / 2); |
| | | uint8_t* mini_v_row = scaledYuvFrame->yuvData[2] + y * (scaledYuvFrame->width / 2); |
| | | |
| | | memcpy(main_v_row, mini_v_row, scaledYuvFrame->width / 2); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | if(!miniView){ |
| | | return; |
| | | } |
| | | if(miniView->videoOn || miniView->streamCode == mainStreamCode){ |
| | | if(miniView->videoOn || miniView->streamCode == mainStreamCode || miniView->streamType == 6){ |
| | | pthread_mutex_lock(&pushVideoMutex); |
| | | YUVData *yuvFrame = new YUVData(); |
| | | yuvFrame->width = miniView->width; |