10 #include <sys/types.h>
13 #include <QStringList>
35 #ifndef MYTHTV_BSWAP_H
36 #define MYTHTV_BSWAP_H
40 #define bswap_dbl(x) bswap_64(x)
43 # include <byteswap.h>
44 #elif HAVE_SYS_ENDIAN_H
45 # include <sys/endian.h>
46 # if !defined(bswap_16) && defined(bswap16)
47 # define bswap_16(x) bswap16(x)
49 # if !defined(bswap_32) && defined(bswap32)
50 # define bswap_32(x) bswap32(x)
52 # if !defined(bswap_64) && defined(bswap64)
53 # define bswap_64(x) bswap64(x)
56 # include <libkern/OSByteOrder.h>
57 # define bswap_16(x) OSSwapInt16(x)
58 # define bswap_32(x) OSSwapInt32(x)
59 # define bswap_64(x) OSSwapInt64(x)
61 # error Byte swapping functions not defined for this platform
69 #include "libswscale/swscale.h"
70 #include "libavutil/imgutils.h"
74 #include <linux/videodev2.h>
81 #define LOC QString("NVR(%1): ").arg(m_videodevice)
101 m_seekTable =
new std::vector<struct seektable_entry>;
166 else if (opt ==
"height")
168 else if (opt ==
"rtjpegchromafilter")
170 else if (opt ==
"rtjpeglumafilter")
172 else if (opt ==
"rtjpegquality")
174 else if ((opt ==
"mpeg4bitrate") || (opt ==
"mpeg2bitrate"))
176 else if (opt ==
"scalebitrate")
178 else if (opt ==
"mpeg4maxquality")
185 else if (opt ==
"mpeg4minquality")
187 else if (opt ==
"mpeg4qualdiff")
189 else if (opt ==
"encodingthreadcount")
191 else if (opt ==
"mpeg4optionvhq")
198 else if (opt ==
"mpeg4option4mv")
205 else if (opt ==
"mpeg4optionidct")
208 m_mp4Opts |= AV_CODEC_FLAG_INTERLACED_DCT;
210 m_mp4Opts &= ~AV_CODEC_FLAG_INTERLACED_DCT;
212 else if (opt ==
"mpeg4optionime")
215 m_mp4Opts |= AV_CODEC_FLAG_INTERLACED_ME;
217 m_mp4Opts &= ~AV_CODEC_FLAG_INTERLACED_ME;
219 else if (opt ==
"hardwaremjpegquality")
221 else if (opt ==
"hardwaremjpeghdecimation")
223 else if (opt ==
"hardwaremjpegvdecimation")
225 else if (opt ==
"audiocompression")
227 else if (opt ==
"mp3quality")
229 else if (opt ==
"samplerate")
231 else if (opt ==
"audioframesize")
233 else if (opt ==
"pip_mode")
235 else if (opt ==
"inpixfmt")
237 else if (opt ==
"skipbtaudio")
239 else if (opt ==
"volume")
251 const QString &videodev,
252 const QString &audiodev,
253 const QString &vbidev)
264 setting =
tmp->getValue();
266 if (setting ==
"MPEG-4")
275 #ifdef USING_FFMPEG_THREADS
283 else if (setting ==
"MPEG-2")
289 #ifdef USING_FFMPEG_THREADS
293 else if (setting ==
"RTjpeg")
301 else if (setting ==
"Hardware MJPEG")
303 SetOption(
"videocodec",
"hardware-mjpeg");
311 LOG(VB_GENERAL, LOG_ERR,
LOC +
312 "Unknown video codec. "
313 "Please go into the TV Settings, Recording Profiles and "
314 "setup the four 'Software Encoders' profiles. "
315 "Assuming RTjpeg for now.");
326 setting =
tmp->getValue();
328 if (setting ==
"MP3")
334 else if (setting ==
"Uncompressed")
341 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Unknown audio codec");
401 m_mpaVidCodec = avcodec_find_encoder_by_name(vcodec.constData());
405 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Video Codec not found: %1")
406 .arg(vcodec.constData()));
414 case AV_PIX_FMT_YUV420P:
415 case AV_PIX_FMT_YUV422P:
416 case AV_PIX_FMT_YUVJ420P:
420 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Unknown picture format: %1")
431 usebitrate = (int)(diff * usebitrate);
458 AVDictionary *
opts =
nullptr;
461 m_mpaVidCtx->bit_rate_tolerance = usebitrate * 100;
471 av_dict_set(&
opts,
"rc_strategy",
"2", 0);
472 av_dict_set(&
opts,
"b_strategy",
"0", 0);
478 av_dict_set(&
opts,
"rc_init_cplx",
"0", 0);
482 m_mpaVidCtx->strict_std_compliance = FF_COMPLIANCE_UNOFFICIAL;
487 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Unable to open FFMPEG/%1 codec")
514 double aspectnum =
m_wOut / (double)tot_height;
517 if (aspectnum == 0.0)
519 else if (fabs(aspectnum - 1.3333333333333333) < 0.001)
521 else if (fabs(aspectnum - 1.7777777777777777) < 0.001)
523 else if (fabs(aspectnum - 2.21) < 0.001)
526 aspect = aspectnum * 1000000;
534 if (
m_wOut && tot_height &&
550 case 2398: den = 24000;
554 case 2998: den = 30000;
558 case 5995: den = 60000;
567 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"NVR: frame rate = %1")
577 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to init audio input device");
611 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Warning, old RingBuffer creation");
617 m_error =
"Could not open RingBuffer";
638 LOG(VB_GENERAL, LOG_ERR,
LOC +
645 LOG(VB_GENERAL, LOG_ERR,
LOC +
653 LOG(VB_GENERAL, LOG_ERR,
LOC +
654 QString(
"Failed to determine audio block size on %1,"
663 LOG(VB_AUDIO, LOG_INFO,
LOC +
664 QString(
"Audio device %1 buffer size: %1 bytes")
671 lame_set_bWriteVbrTag(
m_gf, 0);
673 lame_set_compression_ratio(
m_gf, 11);
677 if ((
tmp = lame_init_params(
m_gf)) != 0)
679 LOG(VB_GENERAL, LOG_ERR,
LOC +
680 QString(
"AudioInit(): lame_init_params error %1").arg(
tmp));
686 LOG(VB_GENERAL, LOG_ERR,
LOC +
687 "AudioInit(): lame support requires 16bit audio");
708 LOG(VB_GENERAL, LOG_ERR,
LOC +
"MJPEG not supported by device");
744 vidbuf->freeToEncode = 0;
745 vidbuf->freeToBuffer = 1;
746 vidbuf->bufferlen = 0;
747 vidbuf->forcekey =
false;
757 audbuf->freeToEncode = 0;
758 audbuf->freeToBuffer = 1;
767 txtbuf->freeToEncode = 0;
768 txtbuf->freeToBuffer = 1;
778 delete [] (vidbuf->buffer);
796 m_fd = open(vdevice.constData(), O_RDWR);
800 m_fd = open(vdevice.constData(), O_RDWR);
819 struct v4l2_capability vcap {};
821 if (ioctl(
m_channelFd, VIDIOC_QUERYCAP, &vcap) < 0)
826 if (
m_usingV4l2 && !(vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
828 LOG(VB_GENERAL, LOG_ERR,
LOC +
829 "Not a v4l2 capture device, falling back to v4l");
833 if (
m_usingV4l2 && !(vcap.capabilities & V4L2_CAP_STREAMING))
835 LOG(VB_GENERAL, LOG_ERR,
LOC +
836 "Won't work with the streaming interface, falling back");
840 if (vcap.card[0] ==
'B' && vcap.card[1] ==
'T' &&
841 vcap.card[2] ==
'8' && vcap.card[4] ==
'8')
844 QString driver = (
char *)vcap.driver;
845 if (driver ==
"go7007")
852 if (lzo_init() != LZO_E_OK)
854 LOG(VB_GENERAL, LOG_ERR,
LOC +
"lzo_init() failed, exiting");
855 m_error =
"lzo_init() failed, exiting";
862 m_error =
"Failed to open device";
871 m_error =
"Failed to set V4L2 format";
894 m_error = QString(
"Cannot open '%1' for writing")
902 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Children are already alive");
903 m_error =
"Children are already alive";
925 gettimeofday(&
m_stm,
nullptr);
948 struct v4l2_format vfmt {};
950 vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
954 vfmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
957 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
959 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P;
961 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
963 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
966 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
968 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
971 vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
972 if (ioctl(
m_fd, VIDIOC_S_FMT, &vfmt) < 0)
974 LOG(VB_GENERAL, LOG_ERR,
LOC +
975 "v4l2: Unable to set desired format");
983 LOG(VB_GENERAL, LOG_ERR,
LOC +
984 "v4l2: uyvy format supported, but yuv422 requested.");
985 LOG(VB_GENERAL, LOG_ERR,
LOC +
986 "v4l2: unfortunately, this converter hasn't been "
987 "written yet, exiting");
990 LOG(VB_RECORD, LOG_INFO,
LOC +
991 "v4l2: format set, getting uyvy from v4l, converting");
998 LOG(VB_GENERAL, LOG_ERR,
LOC +
999 "v4l2: yuyv format supported, but yuv422 requested.");
1000 LOG(VB_GENERAL, LOG_ERR,
LOC +
1001 "v4l2: unfortunately, this converter hasn't been written "
1005 LOG(VB_RECORD, LOG_INFO,
LOC +
1006 "v4l2: format set, getting yuyv from v4l, converting");
1010 LOG(VB_RECORD, LOG_INFO,
LOC +
1011 "v4l2: format set, getting yuv420 from v4l");
1014 if (
m_width != (
int)vfmt.fmt.pix.width ||
1015 m_height != (
int)vfmt.fmt.pix.height)
1017 LOG(VB_RECORD, LOG_INFO,
LOC +
1018 QString(
"v4l2: resolution changed. requested %1x%2, using "
1021 .arg(vfmt.fmt.pix.width) .arg(vfmt.fmt.pix.height));
1030 #else // if !USING_V4L2
1032 #endif // !USING_V4L2
1038 struct v4l2_buffer vbuf {};
1039 struct v4l2_requestbuffers vrbuf {};
1040 struct v4l2_control vc {};
1042 vc.id = V4L2_CID_AUDIO_MUTE;
1045 if (ioctl(
m_fd, VIDIOC_S_CTRL, &vc) < 0)
1046 LOG(VB_GENERAL, LOG_ERR,
LOC +
1047 "VIDIOC_S_CTRL:V4L2_CID_AUDIO_MUTE: " +
ENO);
1079 m_error =
"Unable to set compression params";
1091 m_error =
"Unable to set MPEG params";
1100 usebitrate = (int)(diff * usebitrate);
1105 m_error =
"Unable to set bitrate";
1115 vrbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1116 vrbuf.memory = V4L2_MEMORY_MMAP;
1117 vrbuf.count = numbuffers;
1119 if (ioctl(
m_fd, VIDIOC_REQBUFS, &vrbuf) < 0)
1121 m_error =
"Not able to get any capture buffers, exiting";
1126 if (vrbuf.count < numbuffers)
1128 LOG(VB_GENERAL, LOG_INFO,
LOC +
1129 QString(
"Requested %1 buffers, but only %2 are available. "
1130 "Proceeding anyway").arg(numbuffers).arg(vrbuf.count));
1133 numbuffers = vrbuf.count;
1135 std::array<uint8_t*,MAX_VIDEO_BUFFERS>
buffers {};
1136 std::array<int,MAX_VIDEO_BUFFERS> bufferlen {};
1138 for (
uint i = 0; i < numbuffers; i++)
1140 vbuf.type = vrbuf.type;
1143 if (ioctl(
m_fd, VIDIOC_QUERYBUF, &vbuf) < 0)
1145 LOG(VB_GENERAL, LOG_ERR,
LOC +
1146 QString(
"unable to query capture buffer %1").arg(i));
1147 m_error =
"Unable to query capture buffer";
1151 buffers[i] = (
unsigned char *)mmap(
nullptr, vbuf.length,
1152 PROT_READ|PROT_WRITE, MAP_SHARED,
1153 m_fd, vbuf.m.offset);
1157 LOG(VB_GENERAL, LOG_ERR,
LOC +
"mmap: " +
ENO);
1158 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Memory map failed");
1159 m_error =
"Memory map failed";
1162 bufferlen[i] = vbuf.length;
1165 for (
uint i = 0; i < numbuffers; i++)
1167 memset(
buffers[i], 0, bufferlen[i]);
1168 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1170 if (ioctl(
m_fd, VIDIOC_QBUF, &vbuf) < 0)
1171 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to enqueue capture buffer (VIDIOC_QBUF failed) " +
ENO);
1174 int turnon = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1175 if (ioctl(
m_fd, VIDIOC_STREAMON, &turnon) < 0)
1176 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to start capture (VIDIOC_STREAMON failed) " +
ENO);
1178 struct timeval tv {};
1181 bool forcekey =
false;
1186 uint8_t *output_buffer =
nullptr;
1187 struct SwsContext *convert_ctx =
nullptr;
1193 AV_PIX_FMT_YUYV422 :
1199 m_error =
"Cannot initialize image conversion buffer";
1204 convert_ctx = sws_getCachedContext(convert_ctx,
m_width,
m_height, in_pixfmt,
1206 SWS_FAST_BILINEAR,
nullptr,
nullptr,
nullptr);
1209 m_error =
"Cannot initialize image conversion context";
1210 av_free(output_buffer);
1215 av_image_fill_arrays(img_out.data, img_out.linesize,
1235 gettimeofday(&
m_stm,
nullptr);
1248 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Resetting and re-queueing");
1249 turnon = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1250 if (ioctl(
m_fd, VIDIOC_STREAMOFF, &turnon) < 0)
1251 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to stop capture (VIDIOC_STREAMOFF failed) " +
ENO);
1253 for (
uint i = 0; i < numbuffers; i++)
1255 memset(
buffers[i], 0, bufferlen[i]);
1256 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1258 if (ioctl(
m_fd, VIDIOC_QBUF, &vbuf) < 0)
1259 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to enqueue capture buffer (VIDIOC_QBUF failed) " +
ENO);
1262 if (ioctl(
m_fd, VIDIOC_STREAMON, &turnon) < 0)
1263 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to start capture (VIDIOC_STREAMON failed) " +
ENO);
1270 FD_SET(
m_fd, &rdset);
1272 switch (select(
m_fd+1, &rdset,
nullptr,
nullptr, &tv))
1277 LOG(VB_GENERAL, LOG_ERR,
LOC +
"select: " +
ENO);
1280 LOG(VB_GENERAL, LOG_INFO,
LOC +
"select timeout");
1285 memset(&vbuf, 0,
sizeof(vbuf));
1286 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1287 vbuf.memory = V4L2_MEMORY_MMAP;
1288 if (ioctl(
m_fd, VIDIOC_DQBUF, &vbuf) < 0)
1290 LOG(VB_GENERAL, LOG_ERR,
LOC +
"DQBUF ioctl failed." +
ENO);
1301 if (errno == EIO || errno == EINVAL)
1307 if (errno == EAGAIN)
1313 forcekey = ((vbuf.flags & V4L2_BUF_FLAG_KEYFRAME) != 0U);
1318 (output_buffer !=
nullptr))
1321 av_image_fill_arrays(img_in.data, img_in.linesize,
1324 sws_scale(convert_ctx, img_in.data, img_in.linesize,
1325 0,
m_height, img_out.data, img_out.linesize);
1329 (output_buffer !=
nullptr))
1332 av_image_fill_arrays(img_in.data, img_in.linesize,
1335 sws_scale(convert_ctx, img_in.data, img_in.linesize,
1336 0,
m_height, img_out.data, img_out.linesize);
1346 vbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1347 if (ioctl(
m_fd, VIDIOC_QBUF, &vbuf) < 0)
1348 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to enqueue capture buffer (VIDIOC_QBUF failed) " +
ENO);
1353 if (ioctl(
m_fd, VIDIOC_STREAMOFF, &turnon) < 0)
1354 LOG(VB_GENERAL, LOG_ERR,
LOC +
"unable to stop capture (VIDIOC_STREAMOFF failed) " +
ENO);
1356 for (
uint i = 0; i < numbuffers; i++)
1358 munmap(
buffers[i], bufferlen[i]);
1363 av_free(output_buffer);
1364 sws_freeContext(convert_ctx);
1369 #else // if !USING_V4L2
1371 #endif // !USING_V4L2
1406 struct timeval now {};
1414 gettimeofday(&now,
nullptr);
1416 auto tcres = durationFromTimevalDelta<std::chrono::milliseconds>(now,
m_stm);
1426 int fn = (tcres -
m_oldTc).count();
1445 LOG(VB_GENERAL, LOG_INFO,
LOC +
1446 "DROPPED frame due to full buffer in the recorder.");
1498 static const std::string kFinfo {
"MythTVVideo" };
1499 static const std::string kVers {
"0.07" };
1517 fileheader.
width = bswap_32(fileheader.
width);
1522 fileheader.
fps = bswap_dbl(fileheader.
fps);
1549 static std::array<uint32_t,128> s_tbls {};
1552 frameheader.
packetlength = s_tbls.size() *
sizeof(uint32_t);
1560 memset(&frameheader, 0,
sizeof(frameheader));
1575 case AV_CODEC_ID_MPEG4: vidfcc =
FOURCC_DIVX;
break;
1576 case AV_CODEC_ID_WMV1: vidfcc =
FOURCC_WMV1;
break;
1577 case AV_CODEC_ID_MSMPEG4V3: vidfcc =
FOURCC_DIV3;
break;
1578 case AV_CODEC_ID_MSMPEG4V2: vidfcc =
FOURCC_MP42;
break;
1579 case AV_CODEC_ID_MSMPEG4V1: vidfcc =
FOURCC_MPG4;
break;
1580 case AV_CODEC_ID_MJPEG: vidfcc =
FOURCC_MJPG;
break;
1581 case AV_CODEC_ID_H263:
1582 case AV_CODEC_ID_H263P: vidfcc =
FOURCC_H263;
break;
1583 case AV_CODEC_ID_H263I: vidfcc =
FOURCC_I263;
break;
1584 case AV_CODEC_ID_MPEG1VIDEO: vidfcc =
FOURCC_MPEG;
break;
1585 case AV_CODEC_ID_MPEG2VIDEO: vidfcc =
FOURCC_MPG2;
break;
1586 case AV_CODEC_ID_HUFFYUV: vidfcc =
FOURCC_HFYU;
break;
1663 memcpy(seekbuf + offset, (
const void *)&entry,
1682 const std::vector<struct kfatable_entry> &kfa_table)
1684 int numentries = kfa_table.size();
1697 for (
const auto& kfa : kfa_table)
1699 memcpy(kfa_buf + offset, &kfa,
1740 LOG(VB_GENERAL, LOG_ERR,
LOC +
1741 "No ringbuffer, recorder wasn't initialized.");
1747 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Ringbuffer isn't open");
1808 LOG(VB_GENERAL, LOG_ERR,
LOC +
1815 LOG(VB_GENERAL, LOG_ERR,
LOC +
1822 LOG(VB_GENERAL, LOG_ERR,
LOC +
1827 struct timeval anow {};
1861 LOG(VB_GENERAL, LOG_ERR,
LOC +
1862 QString(
"Short read, %1 of %2 bytes from ")
1870 gettimeofday(&anow,
nullptr);
1877 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Ran out of free AUDIO buffers :-(");
1887 durationFromTimevalDelta<std::chrono::milliseconds>(anow,
m_stm);
1915 struct timeval tnow {};
1916 gettimeofday(&tnow,
nullptr);
1921 LOG(VB_GENERAL, LOG_ERR,
LOC +
1922 QString(
"Teletext #%1: ran out of free TEXT buffers :-(").arg(act));
1929 durationFromTimevalDelta<std::chrono::milliseconds>(tnow,
m_stm);
1937 std::vector<uint8_t> linebuf {};
2023 if ((c & 0xa0) == 0x20)
2026 c += (c & 0x40) ? 32 : -32;
2032 if (visible || (c !=
' '))
2043 linebuf.push_back(c);
2052 st.len = linebuf.size() + 1;
2054 int bufsize = ((outpos - m_textBuffer[act]->buffer + 1) + st.len);
2055 if (bufsize > maxlen)
2057 memcpy(outpos, &st,
sizeof(st));
2058 outpos +=
sizeof(st);
2059 int count = std::max(st.len,
static_cast<uint8_t
>(41));
2060 std::copy(linebuf.cbegin(), linebuf.cbegin() + count, outpos);
2066 m_textBuffer[act]->bufferlen = outpos - m_textBuffer[act]->buffer + 1;
2067 m_textBuffer[act]->freeToBuffer = 0;
2069 if (m_actTextBuffer >= m_textBufferCount)
2070 m_actTextBuffer = 0;
2071 m_textBuffer[act]->freeToEncode = 1;
2075 #endif // USING_V4L2
2079 struct timeval tnow {};
2080 gettimeofday (&tnow,
nullptr);
2084 auto tc = durationFromTimevalDelta<std::chrono::milliseconds>(tnow,
m_stm);
2089 std::chrono::milliseconds timecode,
char )
2094 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Teletext#%1").arg(act) +
2095 " ran out of free TEXT buffers :-(");
2147 std::chrono::milliseconds firsttimecode = -1ms;
2157 (
action == ACTION_NONE ||
2166 (
action == ACTION_NONE ||
2201 LOG(VB_GENERAL, LOG_ERR,
LOC +
2202 "ACTION_AUDIO cannot be completed due to error.");
2282 std::array<uint8_t*,3> planes {
2287 std::chrono::milliseconds timecode = frame->
m_timecode;
2301 bool wantkeyframe = forcekey;
2303 bool writesync =
false;
2330 wantkeyframe =
true;
2346 mpa_picture->pict_type = AV_PICTURE_TYPE_I;
2348 mpa_picture->pict_type = AV_PICTURE_TYPE_NONE;
2352 AVPacket *packet = av_packet_alloc();
2353 if (packet ==
nullptr)
2355 LOG(VB_RECORD, LOG_ERR,
"packet allocation failed");
2358 packet->data = (uint8_t *)
m_strm;
2361 bool got_packet =
false;
2362 int ret = avcodec_receive_packet(
m_mpaVidCtx, packet);
2365 if (ret == AVERROR(EAGAIN))
2368 ret = avcodec_send_frame(
m_mpaVidCtx, mpa_picture);
2376 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"video encode error: %1 (%2)")
2378 av_packet_free(&packet);
2384 av_packet_free(&packet);
2390 av_packet_free(&packet);
2437 LOG(VB_GENERAL, LOG_ERR,
LOC +
"lzo compression failed");
2444 frameheader.
timecode = timecode.count();
2473 else if (compressthis == 0 || (
tmp < (
int)out_len))
2526 LOG(VB_RECORD, LOG_INFO,
LOC + QString(
"audio behind %1 %2").
2532 frameheader.
timecode = timecode.count();
2538 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
2539 QString(
"first timecode=%1").arg(
m_firstTc.count()));
2551 auto mt = (double)timecode.count();
2561 std::array<uint8_t,7200> mp3gapless {};
2562 int compressedsize = 0;
2563 int gaplesssize = 0;
2568 #if (Q_BYTE_ORDER == Q_BIG_ENDIAN)
2569 auto buf16 =
reinterpret_cast<uint16_t *
>(buf);
2571 buf16[i] = qToLittleEndian<quint16>(buf16[i]);
2575 lameret = lame_encode_buffer_interleaved(
2576 m_gf, (
short int*) buf, sample_cnt,
2581 lameret = lame_encode_buffer(
2582 m_gf, (
short int*) buf, (
short int*) buf, sample_cnt,
2588 LOG(VB_GENERAL, LOG_ERR,
LOC +
2589 QString(
"lame error '%1'").arg(lameret));
2590 m_error = QString(
"Audio Encoding Error '%1'")
2594 compressedsize = lameret;
2596 lameret = lame_encode_flush_nogap(
m_gf, mp3gapless.data(), mp3gapless.size());
2599 LOG(VB_GENERAL, LOG_ERR,
LOC +
2600 QString(
"lame error '%1'").arg(lameret));
2601 m_error = QString(
"Audio Encoding Error '%1'")
2605 gaplesssize = lameret;
2608 frameheader.
packetlength = compressedsize + gaplesssize;
2632 LOG(VB_RECORD, LOG_INFO,
LOC +
"audio behind");
2650 frameheader.
timecode = timecode.count();
2659 struct { int8_t m_a,m_b,m_c,m_d; } m_val8;