handleControlCode(ccPacket) {
    const b1 = ccPacket.ccData1;
    const b2 = ccPacket.ccData2;

    // FCC wants control codes transmitted twice, and that will often be
    // seen in broadcast captures. If the very next frame has a duplicate
    // control code, that duplicate is ignored. Note that this only applies
    // to the very next frame, and only for one match.
    if (this.lastCp_ === ((b1 << 8) | b2)) {
      this.lastCp_ = null;
      return null;
    }

    // Remember valid control code for checking in next frame!
    this.lastCp_ = (b1 << 8) | b2;

    if (this.isPAC_(b1, b2)) {
      this.controlPac_(b1, b2);
    } else if (this.isMidrowStyleChange_(b1, b2)) {
      this.controlMidrow_(b2);
    } else if (this.isBackgroundAttribute_(b1, b2)) {
      this.controlBackgroundAttribute_(b1, b2);
    } else if (this.isSpecialNorthAmericanChar_(b1, b2)) {
      this.curBuf_.addChar(
          shaka.cea.Cea608Memory.CharSet.SPECIAL_NORTH_AMERICAN, b2);
    } else if (this.isExtendedWesternEuropeanChar_(b1, b2)) {
      this.handleExtendedWesternEuropeanChar_(b1, b2);
    } else if (this.isMiscellaneous_(b1, b2)) {
      return this.controlMiscellaneous_(ccPacket);
    } else if (this.isOffset_(b1, b2)) {
      const offset = b2 - 0x20;
      this.handleOffset_(offset);
    }
    return null;
  }
Decodes control code.
Three types of control codes:
Preamble Address Codes, Mid-Row Codes, and Miscellaneous Control Codes.
@param {!shaka.cea.Cea608DataChannel.Cea608Packet} ccPacket
@return {?shaka.extern.ICaptionDecoder.ClosedCaption}